有人在这里看到任何错误吗?我正在尝试通过管道从父母到孩子得到消息

时间:2019-05-08 18:13:14

标签: c pipe fork

这里的问题是子进程不等待消息从功能startWorking()到达,因此我得到的是随机字符作为输出,有时什么也没有。

我正在从startWorking()向管道发送一个char数组,并且确保只有父级才能完成此工作。

一种解决方案是,在写入管道之后,从startWorking()向子处理器发送信号。 但是read()函数的行为是等待管道接收到消息,然后才读取消息,但是不知何故,或者编写消息时出现了问题。

int main(int argc, char const *argv[])
{
    pid_t pid;
    pid = fork();
    int mypipefd[2];
    if (pid > 0)
    {
        if (pipe(mypipefd) == -1) 
        {
        perror("Pipe failed\n");
        exit(EXIT_FAILURE);
        }
        storeEngine(mypipefd);
    } 
    else if(pid < 0) 
    {
        perror("fork call failed \n");
        exit(EXIT_FAILURE);
    }
    else 
    {
        printf("I am the child \n");
        printf("child: %d \n", getpid());

        char message[6];
        close(mypipefd[1]);
        read(mypipefd[0], &message, 6);
        close(mypipefd[0]);
        printf("child read value:\n ");
        printf("%s \n", message);
    }
    return 0;
}
void startWorking(int *mypipefd)
{   
    printf("%d \n" ,getpid());
    //close(*mypipefd);
    write(*(mypipefd+1), "hello", 6);
    close(*(mypipefd+1));
}

请注意,如果我删除close(*mypipefd)后面的两个斜杠,该程序将永远无法完成,并且会卡在那里。

2 个答案:

答案 0 :(得分:3)

在不检查其余代码的情况下,您需要在调用pipe()之前先调用fork(),以便父进程和子进程均可使用该管道。如果在调用pipe()之后再调用fork(),则该管道只能在该进程中使用。

更像这样:

int main(int argc, char const *argv[])
{
    int mypipefd[2];

    if ( pipe( mypipefd ) == -1 )
    {
        perror("Pipe failed\n");
        exit(EXIT_FAILURE);
    }

    pid_t pid = fork();
    if (pid > 0)
    {
        storeEngine(mypipefd);
    } 
    .
    .
    .

答案 1 :(得分:0)

否,应该在fork()之前创建用于在进程之间进行通信的管道(否则,您将无法通过它们进行发送,因为读取和写入的末端应由不同的进程使用)。