siginfo = signal.sigwaitinfo({signal.SIGUSR1})
print("py: got %d from %d by user %d\n" % (siginfo.si_signo,
siginfo.si_pid,
siginfo.si_uid))
我可以在python 3中完成上述操作。
python 2.7中是否有等价物?
我想获取信号发件人的信息
答案 0 :(得分:2)
我知道的唯一方法是从python中调用c标准库。
python stdlib中使用ctypes的一种方法,但它非常复杂。
所以我给出cffi解决方案
这是一个两步过程
首先通过运行此脚本编译模块。我将此模块命名为_siggwaitinfo
from cffi import FFI
ffi = FFI()
ffi.set_source("_sigwaitinfo","""
#include <signal.h>
""")
print("new")
ffi.cdef("""
// the typedef are not guess by in struct by cffi
typedef int pid_t;
typedef unsigned int uid_t;
typedef struct {
int si_signo; /* Signal number */
pid_t si_pid; /* Sending process ID */
uid_t si_uid; /* Real user ID of sending process */
...;
} siginfo_t ;
typedef struct {
...; } sigset_t;
#define SIGUSR1 ...
#define SIG_BLOCK ...
int sigaddset(sigset_t *set, int signum);
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
int sigwaitinfo(const sigset_t *set, siginfo_t *info);
""")
ffi.compile()
然后通过脚本使用它几乎和原始c代码一样简单(测试返回代码是一个额外的负担添加与python代码相比。它是作为练习给读者)
from _sigwaitinfo import ffi, lib
set = ffi.new("sigset_t *")
info = ffi.new("siginfo_t *")
ret= lib.sigaddset(set,lib.SIGUSR1)
print ("return code of sigaddset",ret)
#a call to sigprocmask is necessary to not die
ret= lib.sigprocmask(lib.SIG_BLOCK,set,ffi.NULL);
print ("return code of sigprocmask",ret)
ret = lib.sigwaitinfo(set,info)
print("return code of sigwaitinfo",ret)
print("py: got %d from %d by user %d\n" % (info.si_signo,
info.si_pid,
info.si_uid))