使用fork()在C(不是C ++)中创build3个孩子

嗨,我一直在制定一项计划,让孩子们分叉,然后再从每个孩子那里分娩更多的孩子,但这不是我需要帮助的。 当我运行我的程序(在这里它是一个function,但工作原理是一样的)我应该有一个父母(PPID)产卵3个孩子(PIDS = 1,2,3),但我得到的是相同的PID和PPID 3次(我现在的代码),或者在我得到3个父母之前,每个父母都有一个孩子,PPIDS与PIDS不同,但PPID与以前的孩子PID一样。 在我最近的尝试中,从不在父子(父亲)的信息上方显示孩子(儿子)。 它应该看起来像这样

[dad] hi am I PID 1234 and I come from ####(dont care what this number is) [son] hi i am PID 1111 and I come from PPID 1234 [son] hi i am PID 1112 and I come from PPID 1234 [son] hi i am PID 1113 and I come from PPID 1234 

这是我的代码。 我只是寻找提示,如果可能的话,除非它只是一个愚蠢的错误,我已经做了像“哦,只是移动fork()到subprocess”或类似的东西。

我也有一个child_count,所以我可以很容易地计数的孩子。

  int forking(null) { void about(char *); int i=0; int j=0; int child_count =0; about("dad"); for(i = 0; i < 3; i++ ){ pid_t child = 0; child = fork(); if (child < 0) { //unable to fork error perror ("Unable to fork"); exit(-1);} else if (child == 0){ //child process about ("son"); printf("I am child #%d \n",child_count); child_count++; exit(0);} else { //parent process (do nothing) } } for(j = 0; j < 3; j++ ){ wait(NULL);//wait for parent to acknowledge child process } return 0; } 

Solutions Collecting From Web of "使用fork()在C(不是C ++)中创build3个孩子"

父母需要
– 打印一条消息
– 三次拨打电话
– 等三个孩子退出

每个孩子都需要
– 打印一条消息
– 出口

所以代码就像

 int main( void ) { printf( "[dad] pid %d\n", getpid() ); for ( int i = 0; i < 3; i++ ) if ( fork() == 0 ) { printf( "[son] pid %d from pid %d\n", getpid(), getppid() ); exit( 0 ); } for ( int i = 0; i < 3; i++ ) wait( NULL ); } 

生成这个输出

 [dad] pid 1777 [son] pid 1778 from pid 1777 [son] pid 1779 from pid 1777 [son] pid 1780 from pid 1777 

你必须记住的一件事是,当你fork ,父母和孩子都会继续在这个时候运行代码。

所以,如果你不正确地做孩子/父母的检测,孩子们很可能会开始自己的孩子。

启动三个孩子而不是孙子孙女的一个好方法是使用一个计数器连同从fork呼叫中返回的进程ID一起,如下所示:

 #include <stdio.h> #include <unistd.h> #define COUNT 3 int main(void) { # Desired and actual count. int count = COUNT, children = 0; // Force parent initially. pid_t retpid = 1; // Only fork if limit not reached AND is parent (children // will exit loop with retpid == 0). while (count-- > 0 && retpid > 0) // Adjust actual count if successful. if ((retpid = fork()) > 0) children++; // Detect parent, all forks returned non-zero. if (retpid != 0) { printf("Parent %d spawned %d/%d children\n", getpid(), children, COUNT); // Wait for children to finish. while (children-- > 0) wait(NULL); } else { // Otherwise you were one of the children. printf("Child %d, sired by %d\n", getpid(), getppid()); } return 0; } 

这会输出你似乎在之后,由于排序变幻莫测, 不一定按顺序:

 Parent 26210 successfully spawned 3/3 children Child 26212, sired by 26210 Child 26213, sired by 26210 Child 26211, sired by 26210 

检查返回的PID将确保只有父母做任何分派,并且计数将限制它到一个具体数量。


你还需要注意的一件事是输出缓冲。 当你分叉时,你可能会得到两个缓冲输出数据的进程。

在输出设备可以被检测为终端的情况下,通常会在输出换行符时发生刷新,所以printf调用可能不会重复正常运行的输出。

例如,您只需要注意,如果将输出重定向到文件,您可能会得到有趣的结果。