Linux用实时信号发送数据

////////////////////////////////////////////////////
//本例是一个用信号发送数据元素的例子
//可以使用 man sigqueue 获得更多信息
//siginfo_t结构允许发送的信号带有一个单独的数据(这个元素可以是一个指针,从而间接传递任意大小的数据 ),要用 union sigval
//sigqueue()可以传送带有数据的消息到指定的进程。要生成一个带有union sigval的信号,必须使用sigqueue()
//要接收union signal,捕捉信号的进程必须在通过sigaction()注册它的信号处理程序时使用SA_SIGINFO
///////////////////////////////////////////////////
#include "head.h"
#include <sys/signal.h>

//catch a signal and record that it was handled
void handler( int signo,siginfo_t* si,void * context )
 {
     printf( "%d\n",si->si_value.sival_int );
     
 }
int main(  )
 {
     sigset_t mask;
     sigset_t oldMask;
     struct sigaction act;
     int me=getpid(  );
     union sigval val;

     //send signals to handler(  ) and keep all signals blocked
     //that handler(  ) has been configured to catch to avoid
     //races in manipulating the global variables
     act.sa_sigaction=handler;
     act.sa_mask=mask;
     act.sa_flags=SA_SIGINFO;

     sigaction( SIGRTMIN,&act,NULL );

     
     //block the signals we're working with so we can see the queuing
     sigemptyset( &mask );
     sigaddset( &mask,SIGRTMIN );

     //the "mask" value of the signal mask is stored in "oldMask".
     sigprocmask( SIG_BLOCK,&mask,&oldMask );

     //genertae signals
     val.sival_int=1;
     sigqueue( me,SIGRTMIN,val );
     val.sival_int++;
     sigqueue( me,SIGRTMIN,val );
     val.sival_int++;
     sigqueue( me,SIGRTMIN,val );

     //enable delivery of the signals
     sigprocmask( SIG_SETMASK,&oldMask,NULL );   //don't save the oldMsk
     return 0;
     
 }

结果:
1
2
3

         union sigval {
             int   sival_int;
             void *sival_ptr;
         };

         siginfo_t {
             int      si_signo;    /* Signal number */
             int      si_errno;    /* An errno value */
             int      si_code;     /* Signal code */
             int      si_trapno;   /* Trap number that caused
                                      hardware-generated signal
                                      (unused on most architectures) */
             pid_t        si_pid;      /* Sending process ID */
             uid_t       si_uid;      /* Real user ID of sending process */
             int           si_status;   /* Exit value or signal */
             clock_t   si_utime;    /* User time consumed */
             clock_t   si_stime;    /* System time consumed */
             sigval_t  si_value;    /* Signal value */
             int           si_int;      /* POSIX.1b signal */
             void       *si_ptr;      /* POSIX.1b signal */
             int          si_overrun;  /* Timer overrun count; POSIX.1b timers */
             int           si_timerid;  /* Timer ID; POSIX.1b timers */
             void      *si_addr;     /* Memory location which caused fault */
             int          si_band;     /* Band event */
             int           si_fd;       /* File descriptor */
         }

相关推荐