我正在用python編寫程序。我希望從stdin讀取,並處理sigchld。我想處理任何一個輸入,而不是旋轉(對輸入進行推測性採樣)。python信號,中斷系統調用
我無法在每次通話時捕獲由信號中斷的sys-call。
我該怎麼做呢?我可以在沒有嘗試/除外的情況下讓這個工作嗎?
我的主要擔心不是嘗試/除了我在代碼到目前爲止。但是,在程序中我將需要其他代碼。它對我來說似乎不是模塊化的。
下面是一些測試代碼:
#!/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
我的主要擔心不是嘗試/除了我在代碼中到目前爲止。但是,在程序中我將需要其他代碼。它對我來說似乎不是模塊化的。 –
這就是爲什麼你爲每個系統調用寫封裝的原因。所以你需要一個嘗試/除了在這六種包裝中的每一種,但你不需要嘗試/除了數百個呼叫中的任何一個。 – abarnert
你是說我需要一個包裝每個系統調用或只是爲了一些? –