我的多进程程序有什么问题?
What is wrong with my multi process program?
我正在做一个程序,其中 objective 在一个进程中创建一个进程 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;
}
我想问的是我哪里做错了,我的逻辑哪里不对,也许可以指点我在网上阅读一些资料。
提前致谢。
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 次:if 内部的 printf 和外部的 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);
之前显示的代码中使用的选项参数的值 0 表示它应该是默认行为(等待进程终止)。
添加到 DMH 答案中,您还应该使用 write() 而不是 printf,因为 printf 正在缓冲输出,因此结果可能会在输出末尾混合
.
http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/create.html
我正在做一个程序,其中 objective 在一个进程中创建一个进程 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;
}
我想问的是我哪里做错了,我的逻辑哪里不对,也许可以指点我在网上阅读一些资料。 提前致谢。
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 次:if 内部的 printf 和外部的 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);
之前显示的代码中使用的选项参数的值 0 表示它应该是默认行为(等待进程终止)。
添加到 DMH 答案中,您还应该使用 write() 而不是 printf,因为 printf 正在缓冲输出,因此结果可能会在输出末尾混合 .
http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/create.html