gpt4 book ai didi

c++ - 管道上的 read() 没有阻塞

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:40:58 24 4
gpt4 key购买 nike

我有以下代码,其中我使用管道在父进程和子进程之间进行两种方式的读写。

据我所知,如果我不使用 O_NONBLOCK,读取应该阻塞,直到数据从另一端写入管道。

但是,我注意到父端的读取没有阻塞。我知道,因为我在 gdb 中进行调试,所以我已经将 sleep 作为 child 内部的第一个语句。

为什么 parent 的 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]);
}
}

最佳答案

如果设置了 O_NONBLOCK,read() 将返回 -1 并将 errno 设置为 [EAGAIN]。

真正的问题是你在使用它们之前关闭了文件描述符。例如,在子进程中,您正在关闭 pipe_fds[1] 并使用它来写入一些值。在父进程中,您正在关闭 pipe_fds[0] 并使用它来读取一些值。进程关闭文件描述符后,进程不应使用它进行读取或写入。通常管道概念是一个进程(父进程或子进程)将使用管道创建的文件描述符之一写入,而另一个进程(父进程或子进程)将使用另一个文件描述符读取数据。

关于c++ - 管道上的 read() 没有阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42834290/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com