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

时间:2015-10-01 22:23:34

标签: c multiprocess

我正在做一个程序,目标是在一个过程中创建一个过程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;
}   

我问的是我做错了什么,我的逻辑错误在哪里,也许我指的是网上的一些阅读。 提前谢谢。

2 个答案:

答案 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