我有这个程序
childpid = 0;
int i, n;
for(i=1; i < n; i++)
if((childpid = fork())
break;
fprintf(stderr, "i:%d process ID: %ld parent ID: %ld child ID: %ld\n,
i, (long)getpid(), (long)getppid(), (long)childpid);
return 0;
它表示由于父进程的childpid变量的值不为0,因此它将跳出循环。子进程的pid为0,将在下一次迭代中成为父进程。
据我所知,在调用fork()行之后,使用代码创建了一个新进程。如果父进程由于其childpid不为0而突破循环,这是否意味着printf语句将运行一次并且程序将在循环结束后终止? 我很困惑这个程序是如何运行的。
我也有这段代码
for(i=1; i < n; i++)
if( ((childpid = fork()) <= 0)
break;
fprintf(stderr, "i:%d process ID: %ld parent ID: %ld child ID: %ld\n,
i, (long)getpid(), (long)getppid(), (long)childpid);
return 0;
这会创建一个流程的粉丝,并与第一个程序相反。子进程突然退出循环,因为它的chilpid等于0,并且父进程在循环中运行。
我星期一参加考试,而且我已经了解了其他一切 请帮忙:/
答案 0 :(得分:1)
这是否意味着printf语句将运行一次,程序将在循环结束后终止?
是的,它会。但在此之前,它还没有产生儿童过程以继承其遗产。
这是一张糟糕的图表,显示了正在发生的事情。在代码片段#1中,进程自行分叉,父进程死亡,然后子进程继续运行。
在代码片段#2中,进程自行分析,子进程死亡,然后父进程继续运行。
在每种情况下,结果都是一长串的打印语句。
答案 1 :(得分:0)
我编辑了你的第一个代码,并在if语句的开头和结尾添加了“{}”和for循环:
**int main()
{
int childpid = 0;
int i, n;
n=5;
for(i=1; i < n; i++){
if((childpid == fork()))
{
break;
}
fprintf(stderr, "i:%d process ID: %ld parent ID: %ld child ID: %ld\n",
i, (long)getpid(), (long)getppid(), (long)childpid);
}
wait(0);
return 0;
}**
这就是结果:
i:1进程ID:3443父ID:2790子ID:0
i:2进程ID:3443父ID:2790子ID:0
i:3进程ID:3443父ID:2790子ID:0
i:4进程ID:3443父ID:2790子ID:0
主要进程(父进程)执行for循环中的所有打印,而每个子进程都在if语句之后退出。
在您的第二个代码上,而不是
你可以写:if(((childpid = fork())&lt; = 0) 打破;
int f=fork();
if (f<0)
{
perror("can't create child\n");
}
if(f==0)
{
break;
}
因为如果 “f” 小于0,则表示该子项未成功创建,如果是,则会突然出现imediatley。