//... static int FD_set[MAX_FD], FD_q[MAX_FD]; // Static structures here to not make malloc at all :) static int pos = 1; static int sig; void Handler(int sig, siginfo_t *si, void *whatisthis) { // work like Edge Triggered if (FD_set[si->si_fd]) {; return; } FD_set[si->si_fd] = pos; FD_q[pos] = si->si_fd; pos++; } MODULE = RtSig PACKAGE = RtSig int SetSigaction(arg) int arg CODE: struct sigaction act; sig = arg; act.sa_flags = SA_SIGINFO|SA_RESTART; act.sa_sigaction = Handler; sigfillset(&act.sa_mask); if (sigaction(sig, &act, 0) == 0) { RETVAL = 1; } else { XSRETURN_UNDEF; } OUTPUT: RETVAL void Poll() INIT: int i; sigset_t mask, old_mask; PPCODE: sigemptyset(&mask); sigaddset(&mask, sig); sigprocmask(SIG_BLOCK, &mask, &old_mask); for (i=1; i < pos; i++) { XPUSHs(sv_2mortal(newSVnv(FD_q[i]))); FD_set[FD_q[i]] = 0; FD_q[i] = 0; } pos = 1; sigprocmask(SIG_SETMASK, &old_mask, 0);