C++ 管道上的read()未阻塞
我有下面一段代码,其中我使用管道在父进程和子进程之间进行双向读写 根据我读到的,如果我不使用O_NONBLOCK,读取应该阻塞,直到数据从另一侧写入管道 但是,我注意到父端的read没有阻塞。我知道,因为我在gdb中调试,所以我将sleep作为第一个语句放在孩子的内部 为什么父对象的read()不在这里阻塞?另外,我还需要做什么来同步这两个进程之间的读/写操作C++ 管道上的read()未阻塞,c++,linux,embedded-linux,C++,Linux,Embedded Linux,我有下面一段代码,其中我使用管道在父进程和子进程之间进行双向读写 根据我读到的,如果我不使用O_NONBLOCK,读取应该阻塞,直到数据从另一侧写入管道 但是,我注意到父端的read没有阻塞。我知道,因为我在gdb中调试,所以我将sleep作为第一个语句放在孩子的内部 为什么父对象的read()不在这里阻塞?另外,我还需要做什么来同步这两个进程之间的读/写操作 typedef struct { int x; int y; }PayLoad; PayLoad pl; bool b
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]);
}
}
typedef结构
{
int x;
int-y;
}有效载荷;
有效载荷pl;
布尔b=假;
int pipe_fds[2];
无效p(整数i,整数j)
{
pl.x=i;
pl.y=j;
管道(管道);
pid_t cpid=fork();
if(cpid==0)//子进程
{
std::this_thread::sleep_for(std::chrono::seconds(100));//仅用于调试
关闭(管道[1]);
读取(管道fds[0],&pl,尺寸(有效载荷));
//…对读取的数据进行一些处理
关闭(管道[0]);
写入(pipe_fds[1],&b,sizeof(bool));
关闭(管道[1]);
}
else if(cpid>0)//父进程
{
关闭(管道[0]);
写入(管道fds[1],&pl,大小(有效负载));
关闭(管道[1]);
read(pipe_fds[0],&b,sizeof(bool));如果设置了O_NONBLOCK,read()将返回a-1并将errno设置为[EAGAIN]
真正的问题是在使用文件描述符之前要关闭它们。例如,在子进程中,要关闭pipe_fds[1],并使用它来写入一些值。在父进程中,要关闭pipe_fds[0]您正在使用它来读取一些值。一旦进程关闭文件描述符,进程就不应该使用它来读取或写入。通常管道概念是一个进程(父进程或子进程)将使用管道创建的一个文件描述符来写入,而另一个进程(父进程或子进程)将使用管道创建的一个文件描述符来写入将使用另一个文件描述符读取数据。< /p>它返回什么?检查返回值!当C++是真的时不要标记C。谢谢。只需添加代码来检查当前读取的返回。在读取之前关闭描述符。事实上,正确的错误处理将节省您一些时间。将来我也可以。K!为什么你要用C++来处理这个问题?这是因为我正在处理一个CPP项目,这个代码在一个CPP文件里面。基本上,我有一个CPP线程用来在外部的库调用上死锁。因此,把一段代码挂在一个进程中,这样我就可以杀死/重新启动挂起的进程。谢谢Erki A和KADina。Descriptor正在关闭。Reader在读取之前先关闭管道的写入端,同样,writer在写入之前关闭管道的读取端。但是,对于上面的场景,如果使用相同的管道,读取器随后想要写入,因此写入器随后想要读取,我应该怎么做?@user2930006:您需要使用2 pipes。