C 在循环中分叉会导致奇怪的行为

C 在循环中分叉会导致奇怪的行为,c,fork,C,Fork,我有以下C代码片段: int i; printf("ncams: %d\n", ncams); for (i = 0; i < ncams; i++) { int *pips_fds = malloc(2 * sizeof(int)); pid_t pid; pipe(pips_fds); printf("cproc_count in parent: %d, counter i: %d\n", cproc_count, i);// cproc_count i

我有以下
C
代码片段:

int i;
printf("ncams: %d\n", ncams);
for (i = 0; i < ncams; i++) {
    int *pips_fds = malloc(2 * sizeof(int));
    pid_t pid;
    pipe(pips_fds);
    printf("cproc_count in parent: %d, counter i: %d\n", cproc_count, i);// cproc_count is a variable declared above in code
    if ( (pid = fork())== -1) {
        logerr_r("cannot fork");
    } else if (pid == 0) {
        if ( close(pips_fds[1]) < 0) {
            logerr_r("cannot close pipe");
        }
        printf("cproc_count in child: %d, counter i: %d\n", cproc_count, i);
        int j;
        for (j = 0; j < i; j++) {
            free_cproc_id(cprocs[i]);//I don't need this in child process.
        }
        free(cprocs);// I don't need it also here in child process.
    } else {
        CProcID *cproc = malloc(sizeof(CProcID));
        cproc->id = ++cproc_count;
        cproc->pipes = pips_fds;
        if (close(pips_fds[0]) < 0) {
            logerr_r("cannot close pipe");
        }
        cprocs[i] = cproc;
    }

}

如您所见,我在parent中有两次
I=1
。有人能告诉我我做错了什么吗?

在父级:0,计数器I:1中打印两次的原因是因为父级打印一次,然后在子级退出后由子级再次打印,否则它将分支并循环。您可能希望在子进程内为从外部中断,否则如果分支,则子进程也不会继续循环和分叉新的子进程。

在父进程:0,计数器i:1中打印两次的原因是父进程打印了一次,然后在孩子退出后再次由孩子打印它的
else if
分支并循环。您可能希望在子进程内为从外部中断,否则如果分支,则子进程也不会继续循环和分叉新的子进程。

在父进程:0,计数器i:1中打印两次的原因是父进程打印了一次,然后在孩子退出后再次由孩子打印它的
else if
分支并循环。您可能希望在子进程内为从外部中断,否则如果分支,则子进程也不会继续循环和分叉新的子进程。

在父进程:0,计数器i:1中打印两次的原因是父进程打印了一次,然后在孩子退出后再次由孩子打印它的
else if
分支并循环。您可能希望在子进程内为从外部中断,否则如果分支,子进程就不会继续循环和分叉新的子进程。

您会期望什么?请注意,线程数将以指数形式增加。我建议您添加进程id输出,这样您就可以区分哪个进程创建了哪个进程。您希望得到什么?请注意,线程数将以指数形式增加。我建议您添加进程id输出,这样您就可以区分哪个进程创建了哪个进程。您希望得到什么?请注意,线程数将以指数形式增加。我建议您添加进程id输出,这样您就可以区分哪个进程创建了哪个进程。您希望得到什么?请注意,线程数将以指数形式增加。我建议您添加进程id输出,以便能够区分哪个进程创建了哪个进程。
ncams: 2
cproc_count in parent: 0, counter i: 0
cproc_count in parent: 1, counter i: 1
cproc_count in child: 1, counter i: 1
cproc_count in child: 0, counter i: 0
cproc_count in parent: 0, counter i: 1
cproc_count in child: 0, counter i: 1