作者有没有办法知道读者已经closures了命名pipe道(或退出)的末尾, 而不写信给它?
我需要知道这一点,因为我写入pipe道的初始数据是不同的; 在数据的其他部分出现之前,读者正在等待一个初始标题。
目前,当我的write()与EPIPE失败时,我检测到这一点。 然后我设置一个标志,说“下一次,发送标题”。 但是,在我写任何东西之前,读者可以closures并重新打开pipe道。 在这种情况下,我从来没有意识到他做了什么,也不会发送他期待的头球。
有没有什么asynchronous事件types的东西可以帮助这里? 我没有看到任何信号被发送。
Bash到批量转换
os.fork()会在写入时使用copy还是在Python中完成父进程的完整副本?
Bash数组创build:(“$ @”)vs($ @)
在terminal窗口中启动文件pipe理器
使用相同的密钥循环访问关联数组
请注意,我没有包含任何语言标记,因为这个问题应该被认为是语言不可知的。我的代码是Python,但答案应该适用于C或其他具有系统调用级别绑定的语言。
在bdist_rpm中设置RPM包名称
为什么“猫a.txt | xargs vi“销毁bash?
windows / linux的iOS应用程序开发(编译不需要)
我怎样才能创build一个基于.png文件的像素图?
GCC 4.7源字符编码和执行字符编码string文字?
如果您正在使用基于poll系统调用的事件循环,则可以使用包含EPolLERR的事件掩码来注册管道。 在Python中, select.poll ,
import select fd = open("pipe","w") poller = select.poll() poller.register(fd,select.PolLERR) poller.poll()
将等待,直到管道关闭。
要测试这个,运行mkfifo pipe ,启动脚本,并在另一个终端运行,例如cat pipe 。 一旦你退出cat进程,脚本将会终止。
奇怪的是,当最后一个阅读器关闭管道时, select显示管道是可读的:
writer.py
#!/usr/bin/env python import os import select import time name = 'fifo2' os.mkfifo(name) def select_test(fd,r=True,w=True,x=True): rset = [fd] if r else [] wset = [fd] if w else [] xset = [fd] if x else [] t0 = time.time() r,w,x = select.select(rset,wset,xset) print 'After {0} sec:'.format(time.time() - t0) if fd in r: print ' {0} is readable'.format(fd) if fd in w: print ' {0} is writable'.format(fd) if fd in x: print ' {0} is exceptional'.format(fd) try: fd = os.open(name,os.O_WRONLY) print '{0} opened for writing'.format(name) print 'select 1' select_test(fd) os.write(fd,'test') print 'wrote data' print 'select 2' select_test(fd) print 'select 3 (no write)' select_test(fd,w=False) finally: os.unlink(name)
演示:
1号航站楼:
$ ./pipe_example_simple.py fifo2 opened for writing select 1 After 1.59740447998e-05 sec: 3 is writable wrote data select 2 After 2.86102294922e-06 sec: 3 is writable select 3 (no write) After 2.15910816193 sec: 3 is readable
2号航站楼:
$ cat fifo2 test # (wait a sec,then Ctrl+C)
没有这样的机制。 一般情况下,根据UNIX方式,任何一端都没有流打开或关闭的信号。 这只能通过阅读或写入来检测(相应地)。
我会说这是错误的设计。 目前,您正尝试让接收机通过打开管道来显示其可用性。 所以要么以适当的方式实现这个信号,要么在管道的发送部分中包含“关闭逻辑”。
总结以上是内存溢出为你收集整理的读取器closures命名pipe道(FIFO)时检测全部内容,希望文章能够帮你解决读取器closures命名pipe道(FIFO)时检测所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)