Chinaunix首页 | 论坛 | 博客
  • 博客访问: 37715
  • 博文数量: 41
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 357
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-20 16:26
文章分类

全部博文(41)

文章存档

2014年(41)

我的朋友

分类: LINUX

2014-05-04 12:29:37

 信号是linux中一种进程间通信方式,是一种软中断机制。通过signal或sigaction函数可以设置进程对一个信号处理方式。
kill函数可以给一个进程发送一个信号   int kill(pid_t pid, int sig);

raise函数可以给进程自己发送一个信号  int raise(int sig);

linux中的信号列表:
 1) SIGHUP  2) SIGINT  3) SIGQUIT  4) SIGILL  5) SIGTRAP
 6) SIGABRT  7) SIGBUS  8) SIGFPE  9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX

  8 #include
  9 #include
 10 #include
 11
 12 void ff(int s)
 13 {
 14     printf("%d is jddddd\n", s);
 15     alarm(1);
 16 }
 17
 18 int main()
 19 {
 20     signal(SIGALRM, ff);
 21     alarm(1);
 22
 23     while(1)
 24     {
 25         pause();
 26     }
 27 }
 28

  8 #include
  9 #include
 10 #include
 11 #include
 12
 13 void sig_int(int sig, siginfo_t *sif, void *arg)
 14 {
 15     printf("sig info:%d\n", sig);
 16     printf("si_signo:%d\n", sif->si_signo);    /* Signal number */
 17     printf("si_errno:%d\n", sif->si_errno);    /* An errno value */
 18     printf("si_code:%d\n", sif->si_code);     /* Signal code */
 19 }
 20
 21 int main()
 22 {
 23     struct sigaction act = {
 24         .sa_sigaction = sig_int,
 25         .sa_flags = SA_SIGINFO,
 26     };
 27     sigaction(SIGINT, &act,NULL);
 28     while(1)
 29     {
 30         printf("how are you!\n");
 31         sleep(1);
 32     }
 33 }

在父进程中设置为忽略的信号,在子进程调用exec加载新程序后,该信号还会被忽略。

在父进程中改变信号的处理函数后,在子进程调用exec加载新程序后,该信号的处理函数会变成默认的处理函数。

Signal函数可以返回要设置信号的旧处理函数,用于保存原来的处理方法。

一个进程如果在执行处理函数时又收到相同的信号,系统会先存储此信号,直到此次信号处理函数执行完再处理新信号。但是如果一个进程在执行一个信号处理函数时,收到了其它类型的信号,那么系统会中断正在执行的信号处理程序,先处理新信号(此时信号是不可叠加的),再执行原来的信号处理程序。两个信号同时产生,系统不能保证他们的处理顺序。


阅读(277) | 评论(0) | 转发(0) |
0

上一篇:linux进程

下一篇:记录锁

给主人留下些什么吧!~~