你好,我一直在开发一个程序,它会fork子进程,并且稍后还会从每个子进程中fork更多的子进程,但这不是我需要帮助的地方。当我运行我的程序(在这里它是一个函数,但是工作方式相同),我应该有一个父进程(PPID)生成3个子进程(PIDS=1,2,3),但我得到的要么是相同的PID和PPID 3次(我的当前代码),要么以前我得到的是3个父进程,每个父进程都有一个子进程,并且PPIDS和PIDS都不同,但是PPIDs与先前的子进程PIDs完全相同。在我的最新尝试中,它从不显示父亲的信息在儿子之上。它应该看起来像这样:
[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()移动到子进程”之类的愚蠢错误。
此外,我有一个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;
}
else
语句中调用wait
将阻塞父进程和子进程。 - Some programmer dudechild
变量,但在初始化之前就使用了它。未初始化的局部变量具有“不确定”的值,如果在没有初始化的情况下使用它们会导致未定义行为。你可能需要考虑在哪里调用fork
。 - Some programmer dudewait
,在fork
调用之后你会无条件地调用它,因此它将在父进程和子进程中都被调用。如果你将child
初始化为零,在你的条件语句中代码将采取什么路径?进程不共享内存,一个进程的内存只为该进程所有,这个内存包括像child_count
这样的变量,所以在一个进程中修改一个变量不会导致在其他任何进程中修改它。再次强调,考虑你在哪里做或者应该做fork
调用。 - Some programmer dudewhile
循环需要改成for(i=0;i<3;i++)
循环。如果在while
循环体中放置一个printf
,你会发现它从未运行,因为由于前面的for
循环,i
已经是 3 了。 - user3386109