C_Linuxプログラミング_シグナル_4、信号の処理フローsigaction&sigqueue関数の使用

3020 ワード

まずLinuxの情報メカニズムを学ぶブログをお勧めします.
https://www.cnblogs.com/hoys/archive/2012/08/19/2646377.html
とても強くて、分かりやすいです.
 
sigactionはsignal関数の強化版,sigqueueはkill関数の強化版といえる.
例1:信号送信及び処理
信号受信プログラムsigreceive(信号インストールがsigaction()によって)を実現する
元の基礎の上で備考を追加して、理解することができるべきです.
 
#include 
#include 
#include 

#include 

#include 

void new_op(int,siginfo_t*,void*);

main(int argc, char const *argv[])

{
        struct sigaction act;  //sigaction          
        int sig;

        //sig=atoi(argv[1]);//atoi                  
        sig=3;
        sigemptyset(&act.sa_mask);//      

        act.sa_flags=SA_SIGINFO;//SA_SIGINFO         

        act.sa_sigaction=new_op;// new_op        

        if(sigaction(sig,&act,NULL) < 0)

        {

                printf("install sigal error
"); } while(1) { sleep(2); printf("wait for the signal
"); } } /* _sa_sigaction , ( ), 3 。 */ void new_op(int signum,siginfo_t *info,void *myact) { printf("receive signal %d", signum); sleep(5); }

例2:信号伝達付加情報(sigqueue関数を用いた)
#include 
#include 
#include 
#include 
#include 
#include 


void new_op(int signum,siginfo_t *info,void *myact)//            

{

        int i;

        for(i=0;i<10;i++)

        {

                printf("%c
",(*( (char*)((*info).si_ptr)+i))); } printf("handle signal %d over;",signum); } main(int argc,char**argv) { struct sigaction act; union sigval mysigval; int i; int sig; pid_t pid; char data[10]; /* void *memset(void *str, int c, size_t n); c( ) str n */ memset(data,0,sizeof(data));// data 0 , for(i=0;i < 5;i++) data[i]='2';//data 2 mysigval.sival_ptr=data;// , //sig=atoi(argv[1]); sig=3; pid=getpid();// sigemptyset(&act.sa_mask);// act.sa_sigaction=new_op;// act.sa_flags=SA_SIGINFO;// , new_op if(sigaction(sig,&act,NULL) < 0) { printf("install sigal error
"); } while(1) { sleep(2); printf("wait for the signal
"); /* sigqueue ,sigval_t sig 3 siginfo_t , 。 sigqueue , kill() */ sigqueue(pid,sig,mysigval);// , } }