在C中的多个进程之间进行通信

时间:2014-11-10 17:03:20

标签: c process pipe fork

我想创建一系列 n 进程 - 一个主人(告诉其他人要做什么)和工作人员做他们被要求的事情。他们之间的沟通是通过使用管道看起来像这样(签署' - '标准管道):主 - 工人1 - 工人2 - ... - 工人n

我的想法是在循环中创建使用fork的子项,然后将所有的prcesses(除了第一个,这将是主人)放在无限循环中,他们将在等待管道中出现的东西。然后他们会做他们应该做的事情(并且如果有必要的话,将命令传递给孩子)并再次等待管道中的某些东西。我认为这个想法很好,但我对这些东西很新(在进程之间进行通信),所以它不起作用。提前感谢您指出错误等等。

这是我的代码(有很多调试打印)。

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;
}

0 个答案:

没有答案