Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 系统编程:Fork()_C_Fork - Fatal编程技术网

C 系统编程:Fork()

C 系统编程:Fork(),c,fork,C,Fork,我已经为涉及fork的问题提供了代码。然而,我很难找出该计划的几个关键部分。问题是,如果命令行 这是不正确的。从命令行初始化pr_limit。pr_limit变量指定一次允许执行的最大子级数。pr_count变量保存活动子级数。将其初始化为0。执行以下主循环,直到标准输入到达文件末尾:如果pr_计数是pr_限制,则等待子循环完成并减少pr_计数。从标准输入(fgets)中读取一行最多包含MAX_BUF个字符的数据,并通过分叉一个子项执行与该命令行对应的程序并执行该文件。递增pr_count以跟踪

我已经为涉及fork的问题提供了代码。然而,我很难找出该计划的几个关键部分。问题是,如果命令行 这是不正确的。从命令行初始化pr_limit。pr_limit变量指定一次允许执行的最大子级数。pr_count变量保存活动子级数。将其初始化为0。执行以下主循环,直到标准输入到达文件末尾:如果pr_计数是pr_限制,则等待子循环完成并减少pr_计数。从标准输入(fgets)中读取一行最多包含MAX_BUF个字符的数据,并通过分叉一个子项执行与该命令行对应的程序并执行该文件。递增pr_count以跟踪活动子项的数量。检查是否有任何子项已完成(**)。已完成的每个子级的递减pr_计数。在标准输入中遇到文件结尾后,等待所有剩余的子项完成 然后退出。对于每个终止的子级,打印其退出代码值

我在实现上遇到困难的部分包括从标准文件中读取命令行,并通过分叉执行与命令行对应的程序。以及跟踪活跃的孩子,并检查孩子是否已经完成。对系统编程来说还是相当新的

int main (int argc, char *argv[])
{
    FILE *file;
    file = fopen("testsim.c", "r+");

    pid_t childpid;
    childpid = fork();

    int len = 0;
    char *line = NULL;

    read = getline(&line, &len, file);
    MAX_BUF = read;
    char buf[MAX_BUF];

    int i, pr_limit;
    int pr_count = 0;

    if (argc != 2)
    {
            fprintf(stderr, "Usage: %s processes\n", argv[0]);
            return 1;
    }

    if (childpid == 0)
    {
            while (!feof(file))
            {
                    if (pr_count == pr_limit)
                    {
                            wait(-1, &status, WNOHANG);
                            pr_count--;
                    }

                    else
                    {
                            fgets(buf, MAX_BUF, file);
                    }
                            pr_limit = atoi(argv[1]);
                            for (i = 0; i < pr_limit; i++)
                            {
                                    if ((childpid = fork()) <= 0)
                                            break;
                            }

                    fprintf(stderr, "i: %d process ID: %ld parent ID: %ld child ID: %ld\n", i, getpid(), getppid(), childpid);
            }
    }

    if (pid < 0)
    {
            perror("Error: \n");
            return EXIT_FAILURE;
    }

    return 0;

}
intmain(intargc,char*argv[])
{
文件*文件;
file=fopen(“testsim.c”、“r+”);
pid_t childpid;
childpid=fork();
int len=0;
char*line=NULL;
read=getline(&line,&len,文件);
MAX_BUF=读取;
char buf[MAX_buf];
int i,pr_极限;
int pr_计数=0;
如果(argc!=2)
{
fprintf(stderr,“用法:%s进程\n”,argv[0]);
返回1;
}
if(childpid==0)
{
而(!feof(文件))
{
if(pr\U计数==pr\U限制)
{
等待(-1,&状态,WNOHANG);
pr_计数--;
}
其他的
{
fgets(buf,MAX_buf,文件);
}
pr_limit=atoi(argv[1]);
对于(i=0;iif((childpid=fork())Read
if(argc!=2)
-您不应该在fork之前这样做吗?如果两个进程都没有通过该条件(如果被触发,并且都退出),那么启动另一个进程似乎毫无意义。@WhozCraig我以为我在if(argc!=2)之后调用了fork,是不是做得不正确??