"""Simple wrapper around the signalfd syscall."""importerrnoimportosimportsignalfrom._signalfdimportffias_ffifrom._signalfdimportlibas_lib__version__='1.0.0'SFD_CLOEXEC=_lib.SFD_CLOEXECSFD_NONBLOCK=_lib.SFD_NONBLOCKSIG_BLOCK=_lib.SIG_BLOCKSIG_UNBLOCK=_lib.SIG_UNBLOCKSIG_SETMASK=_lib.SIG_SETMASKSIGINFO_SIZE=_ffi.sizeof('struct signalfd_siginfo')ALL_SIGNALS=sorted(getattr(signal,s)forsindir(signal)ifs.startswith('SIG')and'_'notins)
[docs]defsignalfd(fd,signals,flags):ifhasattr(fd,'fileno'):fd=fd.fileno()ifnotisinstance(fd,int):raiseTypeError('fd: must be an integer.')ifnotisinstance(flags,int):raiseTypeError('flags: must be an integer.')sigmask=_ffi.new('sigset_t[1]')forsiginsignals:_lib.sigaddset(sigmask,sig)result=_lib.signalfd(fd,sigmask,flags)ifresult<0:err=_ffi.errnoiferr==errno.EBADF:raiseValueError('fd: not a valid file descriptor.')eliferr==errno.EINVAL:ifflags&(0xFFFFFFFF^(SFD_CLOEXEC|SFD_NONBLOCK)):raiseValueError('flags: mask contains invalid values.')else:raiseValueError('fd: not a signalfd.')eliferr==errno.EMFILE:raiseOSError('max system fd limit reached.')eliferr==errno.ENFILE:raiseOSError('max system fd limit reached.')eliferr==errno.ENODEV:raiseOSError('could not mount (internal) anonymous inode device.')eliferr==errno.ENOMEM:raiseMemoryError('insufficient kernel memory available.')else:raiseUnknownError(err)returnresult
[docs]defsigprocmask(flags,signals):ifnotisinstance(flags,int):raiseTypeError('flags: must be an integer.')new_sigmask=_ffi.new('sigset_t[1]')old_sigmask=_ffi.new('sigset_t[1]')_lib.sigemptyset(new_sigmask)forsiginsignals:_lib.sigaddset(new_sigmask,sig)err=_lib.pthread_sigmask(flags,new_sigmask,old_sigmask)iferr:iferr==errno.EINVAL:raiseValueError('flags: invalid value (not one of SIG_BLOCK, SIG_UNBLOCK or SIG_SETMASK)')eliferr==errno.EFAULT:raiseValueError('sigmask is not a valid sigset_t')else:raiseUnknownError(err)return[sforsinALL_SIGNALSif_lib.sigismember(old_sigmask,s)]