我正在做一个程序,目标是在一个过程中创建一个过程3次(获得子进程(1),一个大子进程(2)和一个盛大的子进程(3)进程)并执行操作在每个过程中按创建顺序的相反顺序。这意味着首先我做(3)的动作然后是(2)然后(1)然后是父进程的动作。但输出很奇怪,比如做6个printfs和多个进程说它们有相同的pid。
代码:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main(void)
{
pid_t mypid = getpid();
pid_t child1_pid=fork();
pid_t child2_pid=-1; //waiting for child1 to fork
pid_t child3_pid=-1; //waiting for child2 to fork
int status;
if(child1_pid==0)
{
mypid=getpid();
child2_pid=fork()
if(child2_pid==0)
{
mypid=getpid();
child3_pid=fork()
if(child3_pid==0)
{
mypid=getpid();
printf("3: Im %ld and my parent is %ld\n", mypid, getppid());
}
wait(&status);
printf("2:Im %ld and my parent is %ld\n", mypid, getppid());
}
wait(&status);
printf("1:Im %ld and my parent is %ld\n", mypid, getppid());
}
else
{
wait(&status);
printf("\nIm the father and my pid is %ld\n", mypid);
}
return 0;
}
我问的是我做错了什么,我的逻辑错误在哪里,也许我指的是网上的一些阅读。 提前谢谢。
答案 0 :(得分:1)
if(child1_pid==0)
{
mypid=getpid();
child2_pid=fork()
if(child2_pid==0)
{
mypid=getpid();
child3_pid=fork()
if(child3_pid==0)
{
mypid=getpid();
printf("3: Im %ld and my parent is %ld\n", mypid, getppid());
}
wait(&status);
printf("2:Im %ld and my parent is %ld\n", mypid, getppid());
}
wait(&status);
printf("1:Im %ld and my parent is %ld\n", mypid, getppid());
}
在这段代码中,盛大的孩子将打印3次:printf在其if和外部2中。
大孩子将打印其printf及其外部的一个。
您的新进程正在继续正常执行其余代码,这意味着它将打印代码中存在的以下printf。
要使代码按您的意愿执行,您必须在每个子进程中终止执行,并且每个父进程必须等待其子进程在打印之前终止。
以下内容应按您的意愿运作。
if(child1_pid==0)
{
mypid=getpid();
child2_pid=fork()
if(child2_pid==0)
{
mypid=getpid();
child3_pid=fork()
if(child3_pid==0)
{
mypid=getpid();
printf("3: Im %ld and my parent is %ld\n", mypid, getppid());
return 0;
}
waitpid(child3_pid,&status,0);
printf("2:Im %ld and my parent is %ld\n", mypid, getppid());
return 0;
}
waitpid(child2_pid,&status,0);
printf("1:Im %ld and my parent is %ld\n", mypid, getppid());
}else
{
waitpid(child1_pid,&status,0);
printf("\nIm the father and my pid is %ld\n", mypid);
}
return 0;
函数waitpid等待pid指定的进程完成。 函数声明如下:
pid_t waitpid(pid_t pid, int *status,int options);
前面显示的代码中使用的options参数的值0表示它应该是默认行为(等待进程终止)。
答案 1 :(得分:0)
添加到DMH答案,您还应该使用write()而不是printf,因为printf正在缓冲输出,因此结果可能会在输出结束时混合
http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/create.html