2013-12-12 35 views
0

我有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; 
    } 

} 

現在,從這個輸出是:

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 

正如你所看到的,我有i = 1爲父母兩次。有人可以告訴我我做錯了什麼嗎?

+1

您會期待什麼?請注意你的線程數將呈指數級增長。我建議您添加進程ID輸出,以便您可以區分哪個進程由哪個進程創建。 – drahnr

回答

3

您打印兩次的原因是cproc_count in parent: 0, counter i: 1是因爲它由父母打印一次,然後在孩子退出else if分支並環繞後再次打印。您可能希望breakelse if分支內的外部for之外,以便子進程不會繼續循環並分支新的子進程。