<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>