命名管道FIFO中提供了写操作的原子化,但存在多个写者(生产者)同时往一个管道中写的时候只要每一次写操作的数据长度小于PIPE_BUF就能保证这些数据要么全部写入要么阻塞等待(或出错返回),这样就保证了两次写的数据不会交错。想请教一下匿名管道并没有提供这样的功能,那么当有多个写者同时往一个管道中写的时候是否会出现数据交错的问题?
小伙看你根骨奇佳,潜力无限,来学PHP伐。
named pipe和anonymouse pipe的原子性保证是由read和write来保证的。
named pipe
anonymouse pipe
read
write
write(): {PIPE_BUF} 个字节或更少的写入请求不得与在同一管道上进行写入的其他进程的数据交错。大于 {PIPE_BUF} 字节的写入可能会在任意边界上与其他进程的写入交错数据,无论文件状态标志的 O_NONBLOCK 标志是否设置。 read(): 成功完成后,其中nbyte大于0,read()应标记更新文件的最后数据访问时间戳,并应返回读取的字节数。该数字绝不能大于 nbyte。如果文件中剩余的字节数小于 nbyte,如果 read() 请求被信号中断,或者如果文件是管道、FIFO 或特殊文件并且少于 nbyte,则返回的值可能小于 nbyte nbyte 字节立即可供读取。例如,从与终端关联的文件中执行 read() 可能会返回一行键入的数据。
所以在长度限定下都是原子的。
named pipe
和anonymouse pipe
的原子性保证是由read
和write
来保证的。write():
{PIPE_BUF} 个字节或更少的写入请求不得与在同一管道上进行写入的其他进程的数据交错。大于 {PIPE_BUF} 字节的写入可能会在任意边界上与其他进程的写入交错数据,无论文件状态标志的 O_NONBLOCK 标志是否设置。
read():
成功完成后,其中nbyte大于0,read()应标记更新文件的最后数据访问时间戳,并应返回读取的字节数。该数字绝不能大于 nbyte。如果文件中剩余的字节数小于 nbyte,如果 read() 请求被信号中断,或者如果文件是管道、FIFO 或特殊文件并且少于 nbyte,则返回的值可能小于 nbyte nbyte 字节立即可供读取。例如,从与终端关联的文件中执行 read() 可能会返回一行键入的数据。
所以在长度限定下都是原子的。