当前位置: 技术问答>linux和unix
请教命名管道的问题
来源: 互联网 发布时间:2016-06-19
本文导语: 读了一资料,但有个问题不是太明白,向大家请教 有一个进程A从别的地方获取数据然后写入到FIFO中,当PIPE_BUF满了或者FIFO的另一端为读而打开的进程B死掉了,这个时候,写进程A是不是就是一直阻塞,如果是,那么...
读了一资料,但有个问题不是太明白,向大家请教
有一个进程A从别的地方获取数据然后写入到FIFO中,当PIPE_BUF满了或者FIFO的另一端为读而打开的进程B死掉了,这个时候,写进程A是不是就是一直阻塞,如果是,那么进程A就无法从别处获取数据,那么这些数据是不是就算丢失了呢?举个例子,把apache的日志文件直接定向到一个FIFO上做为写端,那么当读端的进程死掉或者PIPE_BUF满了之后,apache的日志记录会出现什么样的情况,后续的访问日志会不会丢失,会不会影响到apache的运行.谢谢
有一个进程A从别的地方获取数据然后写入到FIFO中,当PIPE_BUF满了或者FIFO的另一端为读而打开的进程B死掉了,这个时候,写进程A是不是就是一直阻塞,如果是,那么进程A就无法从别处获取数据,那么这些数据是不是就算丢失了呢?举个例子,把apache的日志文件直接定向到一个FIFO上做为写端,那么当读端的进程死掉或者PIPE_BUF满了之后,apache的日志记录会出现什么样的情况,后续的访问日志会不会丢失,会不会影响到apache的运行.谢谢
|
没用过把apache的日志文件直接定向到一个FIFO上做为写端,不过倒是用过管道。
管道一般两种打开方式:阻塞、非阻塞
我的经验是:
阻塞方式下:如果一方没打开,另一方就也打不开。如果读写端都打开了,而运行过程中如果写端程序down掉了,读端再调用read,读不出来数据的,但read不会阻塞。如果:写端没有down,只是没有写数据,会阻塞到写端执行write()或者超时(有没有超时我不知道,你可以查查)。
非阻塞模式下:上面问题就都不会阻塞了,只是open的返回值是-1,read和write也没有效果。
凭记忆写的,希望对你有帮助。
管道一般两种打开方式:阻塞、非阻塞
我的经验是:
阻塞方式下:如果一方没打开,另一方就也打不开。如果读写端都打开了,而运行过程中如果写端程序down掉了,读端再调用read,读不出来数据的,但read不会阻塞。如果:写端没有down,只是没有写数据,会阻塞到写端执行write()或者超时(有没有超时我不知道,你可以查查)。
非阻塞模式下:上面问题就都不会阻塞了,只是open的返回值是-1,read和write也没有效果。
凭记忆写的,希望对你有帮助。
|
需要设置FIFO为非阻塞模式就可以了。否则应该会影响apache的运行。
|
估计是丢了,如果不重新读取的话。
|
若是阻塞模式,
apache的日志记录会报错,
不知道会不会down掉。
lz可以去试下。
apache的日志记录会报错,
不知道会不会down掉。
lz可以去试下。
|
不是,这个问题在apuev2上写的很清楚:
若写入一个没有打开着用于读的管道或FIFO,内核将产生一个SIGPIPE信号。
若设置了O_NONBLOCK标志: 管道满时将返回一个EAGAIN错误
若没有设置:管道应该是阻塞
若写入一个没有打开着用于读的管道或FIFO,内核将产生一个SIGPIPE信号。
若设置了O_NONBLOCK标志: 管道满时将返回一个EAGAIN错误
若没有设置:管道应该是阻塞
|
不会 友情UP