<span class="Apple-style-span" style="white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span class="Apple-style-span" style="font-family: 'courier new', monospace;"><div>
Here's something that I came up with so far, I'm having some issues with segfaulting, if I want to pass a struct member by ref in ctypes(see below), if not, I just get a </div><div>"Real-time signal 0" sent back to me.</div>
<div><br></div><div>Any ideas?</div><div><br></div>#!/usr/bin/env python
import os, sys, re</span></span><div><span class="Apple-style-span" style="font-family: 'courier new'; font-size: 12px; white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"><br>
</span><div><span class="Apple-style-span" style="white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span class="Apple-style-span" style="font-family: 'courier new', monospace;">try:
import fcntl</span></span></div><div><span class="Apple-style-span" style="white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span class="Apple-style-span" style="font-family: 'courier new', monospace;">except ImportError:</span></span></div>
<div><span class="Apple-style-span" style="white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span class="Apple-style-span" style="font-family: 'courier new', monospace;"> raise OSError, "Only runs on unix!"</span></span></div>
<div><span class="Apple-style-span" style="white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span class="Apple-style-span" style="font-family: 'courier new', monospace;">
import signal
from ctypes import * #ugh, but just for this exercise
from ctypes import util
#######################################
# sigaction / siginfo structs
#######################################
# struct sigaction {
# void (*sa_handler)(int);
# void (*sa_sigaction)(int, siginfo_t *, void *);
# sigset_t sa_mask;
# int sa_flags;
# void (*sa_restorer)(void);
# }
######################################
class sigval(Union):
_fields_ = [
('sival_int', c_int),
('sival_ptr', c_void_p),
]
class __siginfo(Structure):
_fields_ = [
('si_signo', c_int),
('si_errno', c_int),
('si_code', c_int),
('si_pid', c_uint),
('si_uid', c_uint),
('si_status', c_int),
('si_addr', c_void_p),
('si_value', sigval),
('si_band', c_long),
('pad', c_ulong * 7),
]
siginfo_t = __siginfo
class __sigaction_u(Union):
_fields_ = [
('__sa_handler', CFUNCTYPE(None, c_int)),
('__sa_sigaction', CFUNCTYPE(None, c_int, </span></span><div><span class="Apple-style-span" style="white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span class="Apple-style-span" style="font-family: 'courier new', monospace;"> POINTER(siginfo_t), </span></span></div>
<div><span class="Apple-style-span" style="white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span class="Apple-style-span" style="font-family: 'courier new', monospace;"> c_void_p)),
]
sigaction_u = __sigaction_u
class __sigaction(Structure):
_fields_ = [
('__sigaction_u',sigaction_u),
('sa_tramp', CFUNCTYPE(None, c_void_p, </span></span></div><div><span class="Apple-style-span" style="white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span class="Apple-style-span" style="font-family: 'courier new', monospace;"> c_int, c_int, </span></span></div>
<div><span class="Apple-style-span" style="white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span class="Apple-style-span" style="font-family: 'courier new', monospace;"> POINTER(siginfo_t), c_void_p)),
('sa_mask', c_uint),
('sa_flags', c_int),
]
class sigaction(Structure):
_fields_ = [
('__sigaction_u', sigaction_u),
('sa_mask', c_uint),
('sa_flags', c_int),
]
#######################################
# END sigaction / siginfo structs
######################################
#call back that should be signalled, void so return nothing
def detailed_callback(signalno, siginfostruct, data):
print "detailed callback: ", signalno, \</span></span></div><div><span class="Apple-style-span" style="white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span class="Apple-style-span" style="font-family: 'courier new', monospace;"> siginfostruct, \</span></span></div>
<div><span class="Apple-style-span" style="white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span class="Apple-style-span" style="font-family: 'courier new', monospace;"> data
#ctypes prototype implementation
C_PROTOTYPE_SIGNHANDLER = CFUNCTYPE(None, c_int, </span></span></div><div><span class="Apple-style-span" style="white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span class="Apple-style-span" style="font-family: 'courier new', monospace;"> POINTER(__siginfo), c_void_p)
#cast callback
sighandler_cb = C_PROTOTYPE_SIGNHANDLER(detailed_callback)
#####################################
# globals/literals
#####################################
ABS_PATH_LIBC = util.find_library('libc')
FCNTL_FLAGS= [fcntl.DN_MODIFY,fcntl.DN_CREATE,fcntl.DN_DELETE,fcntl.DN_RENAME]
FCNTL_BIT_FLAG = reduce(lambda x, y: x | y, FCNTL_FLAGS) | fcntl.DN_MULTISHOT
#get library
__clib = cdll.LoadLibrary(ABS_PATH_LIBC)
assert __clib is not None </span></span></div><div><span class="Apple-style-span" style="white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span class="Apple-style-span" style="font-family: 'courier new', monospace;">
#struct sigaction act;
act = sigaction() </span></span></div><div><span class="Apple-style-span" style="font-family: 'courier new'; font-size: 12px; white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"><br>
</span></div><div><span class="Apple-style-span" style="white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#act.sa_sigaction = handler; </span></span></div>
<div><span class="Apple-style-span" style="white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span class="Apple-style-span" style="font-family: 'courier new', monospace;">act.__sigaction_u.sa_sigaction = sighandler_cb </span></span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new'; font-size: 12px; white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"><br></span></div><div><span class="Apple-style-span" style="white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#sigemptyset(&act.sa_mask); </span></span></div>
<div><span class="Apple-style-span" style="white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#python2.6 has byref(act, offset),how can i port this over? </span></span></div>
<div><span class="Apple-style-span" style="white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#maybe addressof(act)+sizeof(sigaction.sa_mask)*(position_in_sigaction)</span></span></div>
<div><span class="Apple-style-span" style="white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span class="Apple-style-span" style="font-family: 'courier new', monospace;">rc = __clib.sigemptyset(byref(act)) </span></span></div>
<div><span class="Apple-style-span" style="white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span class="Apple-style-span" style="font-family: 'courier new', monospace;">assert rc == 0</span></span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new'; font-size: 12px; white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"><br></span></div><div><span class="Apple-style-span" style="font-family: 'courier new'; font-size: 12px; white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;">#<span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; "><span class="Apple-style-span" style="font-family: 'courier new', monospace;"><span class="Apple-style-span" style="font-size: small;">act.sa_flags = SA_SIGINFO;</span></span></span></span></div>
<div><span class="Apple-style-span" style="white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#/usr/include/bit/signum.h SA_SIGINFO</span></span></div>
<div><span class="Apple-style-span" style="white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#TODO: look this up from python
act.sa_flags = 4; </span></span></div><div><span class="Apple-style-span" style="font-family: 'courier new'; font-size: 12px; white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"><br>
</span></div><div><span class="Apple-style-span" style="white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span class="Apple-style-span" style="font-family: 'courier new', monospace;"><span class="Apple-style-span" style="font-family: 'courier new', monospace;"><span class="Apple-style-span" style="font-size: small;">#</span></span><span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 16px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; "><span class="Apple-style-span" style="font-family: 'courier new', monospace;"><span class="Apple-style-span" style="font-size: small;">sigaction(SIGRTMIN, &act, NULL);</span></span><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span class="Apple-style-span" style="font-family: 'courier new', monospace;"><span class="Apple-style-span" style="font-size: small;"> </span></span></span><span class="Apple-style-span" style="font-family: 'courier new'; font-size: 12px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "> </span></span></span></span></div>
<div><span class="Apple-style-span" style="white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span class="Apple-style-span" style="font-family: 'courier new', monospace;"><span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 16px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; "><span class="Apple-style-span" style="font-family: 'courier new'; font-size: 12px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">#<span class="Apple-style-span" style="font-family: arial; font-size: 13px; white-space: normal; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; "><span class="Apple-style-span" style="font-family: 'courier new'; font-size: 12px; white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;">signal.signal( signal.SIGRTMIN, sighandler_cb )</span><span class="Apple-style-span" style="font-family: 'courier new'; font-size: 12px; white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "> </span></span></span></span></span></span></div>
<div><span class="Apple-style-span" style="white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span class="Apple-style-span" style="font-family: 'courier new', monospace;">rc = __clib.sigaction( signal.SIGRTMIN, byref(act), None )
assert rc == 0</span></span></div><div><span class="Apple-style-span" style="font-family: 'courier new'; font-size: 12px; white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"><br>
</span></div><div><span class="Apple-style-span" style="white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#fd stuff, open cwd, monitor for changes, should invoke</span></span></div>
<div><span class="Apple-style-span" style="white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#my callback..
__fd = os.open(os.getcwd(), os.O_RDONLY | os.O_NONBLOCK)
__clib.fcntl( __fd, fcntl.F_SETSIG, signal.SIGRTMIN)
__clib.fcntl( __fd, fcntl.F_NOTIFY, FCNTL_BIT_FLAG )
import time
while True:
signal.pause()
</span></span><span class="Apple-style-span" style="font-family: -webkit-monospace; white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">
</span></div></div></div>