Python 3中Python 3的Signal.sigwaitinfo等价物?

时间:2015-05-28 14:30:10

标签: python python-2.7 signals

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中是否有等价物?

我想获取信号发件人的信息

1 个答案:

答案 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))