这里的问题是子进程不等待消息从功能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)
后面的两个斜杠,该程序将永远无法完成,并且会卡在那里。
答案 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()之前创建用于在进程之间进行通信的管道(否则,您将无法通过它们进行发送,因为读取和写入的末端应由不同的进程使用)。