Linux 轮询(2)是否等待fd上的操作完成?
我想问的是:假设一个进程调用poll(fd数组),等待写入这些文件描述符中的任何一个。假设另一个进程写入其中一个文件描述符。我能否确保第二个进程在poll()返回之前完成写入?这取决于底层伪文件的类型 对于面向字节(字符设备),当Linux 轮询(2)是否等待fd上的操作完成?,linux,process,Linux,Process,我想问的是:假设一个进程调用poll(fd数组),等待写入这些文件描述符中的任何一个。假设另一个进程写入其中一个文件描述符。我能否确保第二个进程在poll()返回之前完成写入?这取决于底层伪文件的类型 对于面向字节(字符设备),当poll返回时,您所知道的只是有一些数据要读取,而不是已经到达任何特定边界。特别是,它不等待“发送方进程完成写入”边界,甚至不等待“来自单个write()call的所有数据”边界。边界不被保留 对于消息队列(在Win32中,这是一个带有pipe\u TYPE\u mes
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)
。语义可能与常规管道或流套接字稍有不同——awrite()
太大将使用EMSGSIZE
失败,而不是阻塞。我必须对一组管道进行轮询,因此我猜这属于第二类case@FranciscoJos大多数管道都是面向字节的。第二种情况(最后一段)仅适用于面向数据报的管道。那么哪一个是面向数据报的管道呢?@FranciscoJoséLetterio:mq_open
在Linux中,或者与Win32管道函数一起使用的pipe_TYPE_MESSAGE
标志。在Linux上,您可以使用socketpair(AF_UNIX,SOCK_SEQPACKET,0,sp)创建一个边界保留的“管道”
。语义可能与常规管道或流套接字有点不同,但是--write()
太大会导致EMSGSIZE
失败,而不是阻塞。