Linux 轮询(2)是否等待fd上的操作完成?

Linux 轮询(2)是否等待fd上的操作完成?,linux,process,Linux,Process,我想问的是:假设一个进程调用poll(fd数组),等待写入这些文件描述符中的任何一个。假设另一个进程写入其中一个文件描述符。我能否确保第二个进程在poll()返回之前完成写入?这取决于底层伪文件的类型 对于面向字节(字符设备),当poll返回时,您所知道的只是有一些数据要读取,而不是已经到达任何特定边界。特别是,它不等待“发送方进程完成写入”边界,甚至不等待“来自单个write()call的所有数据”边界。边界不被保留 对于消息队列(在Win32中,这是一个带有pipe\u TYPE\u mes

我想问的是:假设一个进程调用poll(fd数组),等待写入这些文件描述符中的任何一个。假设另一个进程写入其中一个文件描述符。我能否确保第二个进程在poll()返回之前完成写入?

这取决于底层伪文件的类型

对于面向字节(字符设备),当
poll
返回时,您所知道的只是有一些数据要读取,而不是已经到达任何特定边界。特别是,它不等待“发送方进程完成写入”边界,甚至不等待“来自单个
write()
call的所有数据”边界。边界不被保留


对于消息队列(在Win32中,这是一个带有
pipe\u TYPE\u message
)和数据报套接字的管道,则保留消息边界,并且
write()
(或
send
sendto
)调用的整个参数将自动显示在目标处,
poll()
在传输整个数据报之前不会触发。

它取决于底层伪文件的类型

对于面向字节(字符设备),当
poll
返回时,您所知道的只是有一些数据要读取,而不是已经到达任何特定边界。特别是,它不等待“发送方进程完成写入”边界,甚至不等待“来自单个
write()
call的所有数据”边界。边界不被保留


对于消息队列(在Win32中,这是一个带有
pipe\u TYPE\u message
)和数据报套接字的管道,则保留消息边界,并且
write()
(或
send
sendto
)调用的整个参数将自动显示在目标处,
poll()
在传输整个数据报之前不会触发。

我必须对一组管道进行轮询,所以我猜这属于第二个管道case@FranciscoJoséLetterio:大多数管道都是面向字节的。第二种情况(最后一段)只适用于面向数据报的管道。那么哪一种是面向数据报的管道呢?@FranciscoJoséletrio:
mq_open
,或者与Win32管道函数一起使用的
pipe_TYPE_MESSAGE
标志。在Linux上,您可以使用
socketpair创建一个保留边界的“管道”(AF_UNIX,SOCK_SEQPACKET,0,sp)
。语义可能与常规管道或流套接字稍有不同——a
write()
太大将使用
EMSGSIZE
失败,而不是阻塞。我必须对一组管道进行轮询,因此我猜这属于第二类case@FranciscoJos大多数管道都是面向字节的。第二种情况(最后一段)仅适用于面向数据报的管道。那么哪一个是面向数据报的管道呢?@FranciscoJoséLetterio:
mq_open
在Linux中,或者与Win32管道函数一起使用的
pipe_TYPE_MESSAGE
标志。在Linux上,您可以使用
socketpair(AF_UNIX,SOCK_SEQPACKET,0,sp)创建一个边界保留的“管道”
。语义可能与常规管道或流套接字有点不同,但是--
write()
太大会导致
EMSGSIZE
失败,而不是阻塞。