2015-10-21 24 views
2

請參閱下面的Python代碼:如何獲取Python中傳入信號的進程ID?

def Handler(signum, frame): 
    #do something 
signal.signal(signal.SIGCHLD, Handler) 

有沒有辦法擺脫它是從哪裏來的信號處理ID? 或者還有另外一種方法來獲取來自哪個信號的進程ID而不阻塞主應用程序的流程?

回答

1

os.getpid()返回當前進程ID。所以當你發送信號時,你可以打印出來。

import signal 
import os 
import time 

def receive_signal(signum, stack): 
    print 'Received:', signum 

signal.signal(signal.SIGUSR1, receive_signal) 
signal.signal(signal.SIGUSR2, receive_signal) 

print 'My PID is:', os.getpid() 

有關信號的更多信息,請檢查this

要發送PID的過程中的一個可以使用Pipe

import os 
from multiprocessing import Process, Pipe 


def f(conn): 
    conn.send([os.getpid()]) 
    conn.close() 

if __name__ == '__main__': 
    parent_conn, child_conn = Pipe() 
    p = Process(target=f, args=(child_conn,)) 
    p.start() 
    print parent_conn.recv() # prints os.getpid() 
    p.join() 

Exchanging objects between processes

+0

感謝您的答覆!但是我想識別在接收端發送信號的過程的pid。 –

+0

然後你可以使用類似'Pipe'的東西。我會添加一些代碼給答案 – dkol

+0

dkol,非常感謝! –

4

你不能直接。 Python標準庫的信號模塊沒有規定允許訪問Posix sigaction_t結構。如果你真的需要這個,你將不得不在C或C++中構建一個Python擴展。

你會發現的指針在Extending and Embedding the Python Interpreter - 這個文件也應該是提供您的Python發行

+0

Serge,謝謝! –

+0

在我看來,這應該是被接受的答案。 – sitaktif