FORK多个孩子,然后使用PIPE和SELECT

时间:2013-11-23 08:53:48

标签: c posix fork named-pipes

我正在尝试理解fork,mkfifo和select。

我分叉N个孩子,每个孩子将他的ID写入管道,父母从管道中读取ID。

    int myPipe = mkfifo("pipe", S_IRUSR | S_IWUSR);
    if (myPipe < 0)
        perror("mkfifo: ");

    int n = 3;
    pid_t* pids = malloc(n * sizeof(pid_t));

    int i;
    for (i = 0; i < n; ++i)
    {
        pids[i] = fork();
        if (pids[i] < 0)
            perror("Fork: ");
    }

    fd_set fdMyPipe;
    FD_ZERO(&fdMyPipe);
    FD_SET(myPipe, &fdMyPipe);

    for (i = 0; i < n; ++i)
    {
        if (pids[i] == 0) //child
        {
            printf("Child[%d] : I write my ID to the pipe.\n", i);
            write(myPipe, &i, sizeof(i));
        }
        else //parent
        {
            int j;
            for (j = 0; j < n; ++j)
            {   
                int r = select(myPipe + 1, &fdMyPipe, NULL, NULL, NULL);

                if (FD_ISSET(myPipe, &fdMyPipe))
                {
                    int child;
                    read(myPipe, &child, sizeof(&child));
                    printf("Parent : Child[%d]'s ID is %d.\n", child, child);
                }
            }
        }
    }

输出如下:

Child[0] : I write my ID to the pipe.
Child[0] : I write my ID to the pipe.
Child[0] : I write my ID to the pipe.
Child[1] : I write my ID to the pipe.
Child[0] : I write my ID to the pipe.
Child[1] : I write my ID to the pipe.
Child[2] : I write my ID to the pipe.

我无法理解为什么有4个零,2个以及它们混淆的原因。

此外,当我多次点击输入时,我会得到以下信息:

  

父母:孩子[10]的身份证是10。

     

父母:孩子[10]的身份证是10。

     

父母:孩子[10]的身份证是10。

为什么ID为10,为什么它总是十?

修改

现在我得到正确的孩子数量/顺序。

    for (i = 0; i < n; ++i)
    {
        pids[i] = fork();
        if (pids[i] < 0)
            perror("Fork: ");

        if (pids[i] == 0) //child
        {
            printf("Child[%d] : I write my ID to the pipe.\n", i);
            write(myPipe, &i, sizeof(i));
            return;
        }
        else //parent
        {
            int j;
            for (j = 0; j < n; ++j)
            {   
                int r = select(myPipe + 1, &fdMyPipe, NULL, NULL, NULL);

                if (FD_ISSET(myPipe, &fdMyPipe))
                {
                    int child;
                    read(myPipe, &child, sizeof(child));
                    printf("Parent : Child[%d]'s ID is %d.\n", child, child);
                }
            }
        }
    }

但是,父母仍然会读取一些随机ID。

  

父母:孩子[1426203146]的身份证号码是1426203146。

     

父母:孩子[1426203146]的身份证号码是1426203146。

0 个答案:

没有答案