Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在不删除数据的情况下检查非阻塞匿名管道是否有数据_C_Multithreading_Pipe_Posix - Fatal编程技术网

C 如何在不删除数据的情况下检查非阻塞匿名管道是否有数据

C 如何在不删除数据的情况下检查非阻塞匿名管道是否有数据,c,multithreading,pipe,posix,C,Multithreading,Pipe,Posix,我有一个POSIX线程,它读取非阻塞匿名管道(用O_NONBLOCK标志标记)。当线程停止时(例如由于错误),我想检查管道中是否有剩余的东西(在其内部缓冲区中)。如果管道具有数据运行新线程和相同的读取描述符(在线程之间共享),那么新线程可以继续从管道读取数据。如果管道是空的-关闭管道,什么也不做 所以我需要在不从管道中删除数据的情况下检查管道是否为空(就像常规的read一样)。有什么办法吗 另外,我认为在read中设置count=0(int-fd,void*buf,size\u-t-count)

我有一个POSIX线程,它读取非阻塞匿名管道(用
O_NONBLOCK
标志标记)。当线程停止时(例如由于错误),我想检查管道中是否有剩余的东西(在其内部缓冲区中)。如果管道具有数据运行新线程和相同的读取描述符(在线程之间共享),那么新线程可以继续从管道读取数据。如果管道是空的-关闭管道,什么也不做

所以我需要在不从管道中删除数据的情况下检查管道是否为空(就像常规的
read
一样)。有什么办法吗

另外,我认为在
read中设置
count=0
(int-fd,void*buf,size\u-t-count)可能会有所帮助,但文档表明这是某种未定义的行为:

如果计数为零,read()可能会检测到下面描述的错误。在里面 如果没有任何错误,或者如果read()没有检查错误,则 计数为0的read()返回零,没有其他效果

我相信你想要或者,用零超时打电话

select()文档中的简短说明:

…和poll()文档:


挑剔:零大小读取的文档描述了实现定义的而非未定义的行为。未定义的行为特别意味着任何结果都是正确的。我的C教授曾经说过“未定义的行为意味着你的计算机着火在技术上是有效的”。)而且,我觉得这应该是一个复制品(我无法想象以前没有人问过它),但我似乎找不到一个好的匹配。嗯。@SnildDolkow相信我,我在问之前已经做了非常深入的搜索。是的,我也找不到一个副本,这让我有点惊讶。:)轮询和选择仅适用于文件描述符。我使用匿名管道,它不同于命名管道。它没有任何相应的文件。
pipe()
提供文件描述符。我很确定他们会使用
poll()
select()
。好吧,我错了。这里有人说它必须起作用
   select() and pselect() allow a program to monitor multiple file
   descriptors, waiting until one or more of the file descriptors become
   "ready" for some class of I/O operation (e.g., input possible).
   poll() performs a similar task to select(2): it waits for one of a
   set of file descriptors to become ready to perform I/O.