C语言中多进程间的通信

C语言中多进程间的通信,c,process,pipe,fork,C,Process,Pipe,Fork,我想创建一行n个进程——一个主进程告诉其他进程做什么,另一个进程告诉工人做什么。它们之间的通信是通过管道进行的,看起来像是管道的标志“-”标准:主-工人1-工人2-工人 我的想法是在循环中使用fork创建子进程,然后将除第一个进程之外的所有进程都放在一个无休止的循环中,在这个循环中他们将等待某个东西进入管道。然后,他们会做他们应该做的事情,并在必要时将命令传递给孩子,然后再次等待管道中的东西。我认为这个想法很好,但我对进程之间的通信还很陌生,所以它不起作用。提前感谢您指出问题所在等 这是我的代码

我想创建一行n个进程——一个主进程告诉其他进程做什么,另一个进程告诉工人做什么。它们之间的通信是通过管道进行的,看起来像是管道的标志“-”标准:主-工人1-工人2-工人

我的想法是在循环中使用fork创建子进程,然后将除第一个进程之外的所有进程都放在一个无休止的循环中,在这个循环中他们将等待某个东西进入管道。然后,他们会做他们应该做的事情,并在必要时将命令传递给孩子,然后再次等待管道中的东西。我认为这个想法很好,但我对进程之间的通信还很陌生,所以它不起作用。提前感谢您指出问题所在等

这是我的代码,有很多调试打印

int main(int argc, char* argv[])
{
    int i;
    int n = atoi(argv[1]);
    pid_t pid;
    int isMaster = 0;
    int order;
    int pipeDsc[2][2];

    for (i = 0; i < n; i++)
    {
        if (pipe(pipeDsc[0]) == -1)
            error("Error in pipe\n");
        if (pipe(pipeDsc[1]) == -1)
            error("Error in pipe\n");

        switch (pid = fork())
        {
            case -1:
                error("Error in fork\n");

            case 0: /*child*/
                if (close(pipeDsc[0][1]) == -1)
                    error("Error in close\n");
                if (close(pipeDsc[1][0]) == -1)
                    error("Error in close\n");
                if (i == (n - 1))
                    exit(0);
                break;

            default: /*parent*/
                if (close(pipeDsc[0][0]) == -1)
                    error("Error in close\n");
                if (close(pipeDsc[1][1]) == -1)
                    error("Error in close\n");

                if (i == 0)
                    isMaster = 1;

                if (i > 0)
                {
                    printf("i=%d, my pid is %d\n", i, getpid());
                    while (1)
                    {
                        if (read(pipeDsc[1][0], &order, sizeof(order)) == -1)
                            error("Error in read\n");
                        printf("Received order %d\nMy pid = %d\n\n\n", order, getpid());
                        switch (order)
                        {
                            case 0: /*wait for children to die and die urself*/
                                if (i == 1)
                                {
                                    printf("My pid=%d, im out!\n", getpid());
                                    exit(0);
                                }

                                else
                                {
                                    printf("sending further order %d\n", order);
                                    int temp;
                                    temp = order;
                                    if (write(pipeDsc[0][1], &temp, 
                                                sizeof(temp)) == -1)
                                        error("Error in write\n");
                                    if (wait(0) == -1)
                                        error("Error in wait\n");
                                    printf("My pid=%d, im out!\n", getpid());
                                    exit(0);
                                }

                            default:
                                error("Unknown order\n");
                        }
                    }
                }
        }
        if ((i == 0) && (isMaster == 1))
            break;
    }

    /*
     *
     * Master code here
     * 
     */
    int temp;
    temp = 0;
    printf("master here, my pid = %d\n", getpid());
    if (write(pipeDsc[0][1], &temp, sizeof(temp)) == -1)
        error("Error in master write\n");
    printf("Sent order %d\n", temp);

    /*****/
    return 0;
}

有一个聪明的想法是在60-70年前发明的,叫做“函数”或“子程序”或“方法”。通过使用一些函数,您的代码将得到改进。如果您的代码有11级缩进深度,那么为一些内部代码创建函数几乎总是一个更好的主意;您的孩子们将继续派生更多的进程,但您的父代码处于循环中等待信息。@JonathanLeffler是的,我知道这不是有史以来最漂亮的代码,我肯定会将主代码和订单处理放在函数中。关于那个反向活动-你确定它是错的吗?首先创建流程并转到子部分,在那里关闭不必要的文件描述符,然后作为父级创建另一个子级,然后开始等待信息。否;我不确定这是否是错误的,但如果它是正确的,我不明白你为什么要这么做。我还没有尝试编译代码。@JonathanLeffler这允许我创建一行过程。创建一个进程->子节->关闭一些文件描述符->for循环再次启动->该进程创建一个子节并转到父节,在那里它将等待信息。如果我把等待放在子部分,我就不会得到一行进程。