首页 / PYTHON / python信号,中断系统调用
python信号,中断系统调用
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python信号,中断系统调用,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3118字,纯文字阅读大概需要5分钟。
内容图文
![python信号,中断系统调用](/upload/InfoBanner/zyjiaocheng/803/28404349a352453d84f34992df657742.jpg)
我在python中编写程序.我希望从stdin读取并处理sigchld.我想要处理任何输入,而不是旋转(推测性地为输入采样).
我无法捕获每次通话时被信号中断的系统调用.
我是以错误的方式来做这件事的吗?我可以在没有尝试/除外的情况下使用它吗?
我主要担心的不是尝试/除了我在代码中到目前为止.但是,在程序中的其他代码行中我将需要数百个.它对我来说似乎不是模块化的.
这是一些测试代码:
#!/usr/bin/python
from time import sleep
import select
import signal
import fcntl
import os
import sys
pipe_r, pipe_w = os.pipe()
flags = fcntl.fcntl(pipe_w, fcntl.F_GETFL, 0)
flags = flags | os.O_NONBLOCK
fcntl.fcntl(pipe_w, fcntl.F_SETFL, flags)
signal.signal(signal.SIGCHLD, lambda x,y: None)
signal.signal(signal.SIGALRM, lambda x,y: None)
signal.siginterrupt(signal.SIGCHLD,False) #makes no difference
signal.siginterrupt(signal.SIGALRM,False) #makes no difference
signal.set_wakeup_fd(pipe_w)
signal.setitimer(signal.ITIMER_REAL, 2, 2)
poller = select.epoll()
poller.register(pipe_r, select.EPOLLIN)
poller.register(sys.stdin, select.EPOLLIN)
print "Main screen turn on"
while True:
events=[]
try:
events = poller.poll()
try:
for fd, flags in events:
ch=os.read(fd, 1)
if fd==pipe_r:
sys.stdout.write( "We get Signal" )
if fd==sys.stdin.fileno():
sys.stdout.write( ch )
sys.stdout.flush()
except IOError as e:
print "exception loop" + str(e)
except IOError as e:
print "exception poll" + str(e)
版本:
#python --version
python 2.7.3
#uname -a
Linux richard 3.2.0-32-generic #51-Ubuntu SMP Wed Sep 26 21:33:09 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
解决方法:
是的,你正是以正确的方式解决这个问题. (好吧,我可能会使用select或者poll而不是epoll,因为那时你的代码可以移植到非linux平台……)
我假设在这里对两个或多个fds进行轮询对于你的设计来说是固有的必要条件.如果你只添加epoll循环来处理信号,那么这部分就没有必要;你需要的只是一个围绕读取调用的简单EINTR循环.但是,一旦你有一个用于其他目的的管道,把它挂起来作为信号唤醒管是一个合理的事情,然后你的,你正在做的其他一切都隐含在从多个fds读取.
无论哪种方式,你真的无法避免尝试块. (这不完全正确.你总是可以使用sigblock / sigprocmask /等来阻止信号 – 它们不在Python的信号模块中,但是你总是可以对它们进行ctypes.但是你通常需要更多的代码,试一试/最后,而不是try / except,你的代码变得更难调试,所以除了在你处理无法中断且必须被sigblocked的代码的少数情况下,沿着这条路走下去没什么意义. )
这是POSIX的标准功能,许多系统调用可以被信号中断,在这种情况下,它们会因EINTR而失败.
大多数特定平台将可以中断的调用列表限制为比POSIX允许的更小的集合,因此您必须查看linux文档以确定究竟是什么和不是EINTR安全的,但epoll系列的方法,以及read / recv / write / send和朋友,几乎肯定是不安全的.
像你一样使用siginterrupt可能有所帮助,但它并没有解决问题.特别是,不需要调用来重新启动而不是中断,并且在某些情况下,他们需要中断或完成部分结果而不是重新启动.我很确定select和poll永远不会重启,所以epoll家族很可能也不是,但你必须检查.无论如何,大多数BSD衍生产品默认重启,所以如果linux是相同的,你就不会改变任何东西.
Python本可以用隐式EINTR循环包装所有这些,我相信一些更高级别的方法(如sendall)会这样做,但是较低级别的方法不会这样做.但你可以自己包装好.例如(在我的头顶,未经测试):
def dopoll(poller):
while True:
try:
return poller.poll()
except IOError as e:
if e.errno != EINTR:
raise
然后,在你称之为民意调查的地方,请拨打dopoll.
内容总结
以上是互联网集市为您收集整理的python信号,中断系统调用全部内容,希望文章能够帮你解决python信号,中断系统调用所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。