我的多进程程序有什么问题?

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