我有下面的代码片段,在其中我使用管道进行父子进程之间的双向读写。
据我所知,如果我不使用O_NONBLOCK,则读操作应该会阻塞直到数据从另一端被写入管道中。
然而,我注意到父进程端的读取没有被阻塞。我知道因为我正在gdb中进行调试,所以我在子进程的第一个语句中放置了一个睡眠。
为什么父进程的read()在这里没有被阻塞?还有,我是否需要做其他事情来同步两个进程之间的读写如下?
typedef struct
{
int x;
int y;
}PayLoad;
PayLoad pl;
bool b = false;
int pipe_fds[2];
void p(int i, int j)
{
pl.x = i;
pl.y = j;
pipe(pipe_fds);
pid_t cpid = fork();
if (cpid == 0) // child process
{
std::this_thread::sleep_for(std::chrono::seconds(100)); // just for debugging
close(pipe_fds[1]);
read(pipe_fds[0], &pl, sizeof(Payload));
//... do some processing on read data
close(pipe_fds[0]);
write(pipe_fds[1], &b, sizeof(bool));
close(pipe_fds[1]);
}
else if (cpid > 0) // parent process
{
close(pipe_fds[0]);
write(pipe_fds[1], &pl, sizeof(Payload));
close(pipe_fds[1]);
read(pipe_fds[0], &b, sizeof(bool)); <------ did not block!
close(pipe_fds[0]);
}
}