C_Linuxプログラミング_シグナル_4、信号の処理フローsigaction&sigqueue関数の使用
まずLinuxの情報メカニズムを学ぶブログをお勧めします.
https://www.cnblogs.com/hoys/archive/2012/08/19/2646377.html
とても強くて、分かりやすいです.
sigactionはsignal関数の強化版,sigqueueはkill関数の強化版といえる.
例1:信号送信及び処理
信号受信プログラムsigreceive(信号インストールがsigaction()によって)を実現する
元の基礎の上で備考を追加して、理解することができるべきです.
例2:信号伝達付加情報(sigqueue関数を用いた)
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);// ,
}
}