2017-01-19 23 views
2

os.killを使ってみましたが、動作していないようです。サブプロセスから親プロセスへシグナルを送信する方法は?

import signal 
import os 
from time import sleep 


def isr(signum, frame): 
    print "Hey, I'm the ISR!" 

signal.signal(signal.SIGALRM, isr) 

pid = os.fork() 
if pid == 0: 
    def sisr(signum, frame):   
     os.kill(os.getppid(), signal.SIGALRM) 

    signal.signal(signal.SIGVTALRM, sisr) 
    signal.setitimer(signal.ITIMER_VIRTUAL, 1, 1) 

    while True: 
     print "2" 
else: 
    sleep(2) 

答えて

1

お客様のsisrハンドラは実行されません。

signal.setitimer(signal.ITIMER_VIRTUAL, 1, 1) 

この行は、「プロセスがを実行し、満了するとSIGVTALRMを提供している場合にのみデクリメントインターバルタイマー」マニュアルに従って、仮想タイマ、を設定します。

あなたのプロセスはほとんど実行されません。プリントはプロセス内でほとんど時間がかからず、カーネルは出力をコンソールアプリケーション(xterm、konsole、...)に渡し、アプリケーションは画面を再描画します。一方、あなたの子プロセスはスリープ状態であり、タイマーは実行されません。実際のタイマー付き

変更して、それが動作:)

import signal 
import os 
from time import sleep 


def isr(signum, frame): 
    print "Hey, I'm the ISR!" 

signal.signal(signal.SIGALRM, isr) 

pid = os.fork() 
if pid == 0: 
    def sisr(signum, frame):   
     print "Child running sisr" 
     os.kill(os.getppid(), signal.SIGALRM) 

    signal.signal(signal.SIGALRM, sisr) 
    signal.setitimer(signal.ITIMER_REAL, 1, 1) 

    while True: 
     print "2" 
     sleep(1) 
else: 
    sleep(10) 
    print "Parent quitting" 

出力:

[email protected]:~/temp$ python test.py 
2 
Child running sisr  
2 
Hey, I'm the ISR! 
Parent quitting 
[email protected]:~/temp$ Child running sisr 

Traceback (most recent call last): 
    File "test.py", line 22, in <module> 
    sleep(1) 
    File "test.py", line 15, in sisr 
    os.kill(os.getppid(), signal.SIGALRM) 
OSError: [Errno 1] Operation not permitted 

注:子供はそれが原因で、その後、sisrを実行します時間をクラッシュ親が終了したので、os.getppid()0に戻り、プロセス0に信号を送信することは禁止されています。

+0

"print"がCPU時間をまったく消費していないことはわかりませんでした。印刷する代わりに、今私はいくつかの算術を入れました。しかし、ありがとう! –

+1

しかし、カーネルを介してテキストをコンソールエミュレータに渡してからフォントをウィンドウにレンダリングし、ウィンドウマネージャにリフレッシュを送信するように指示するまでに使用する量は無視してもかまいませんビデオドライバ、またはそれが何をしていても。 – spectras

+0

したがって、タイマーが動作(仮想)すると、カーネルで何が起こったとしても考慮されません。 –

関連する問題