免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4373 | 回复: 13
打印 上一主题 下一主题

哪位高手愿意谈一下信号的使用? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-12-24 09:30 |只看该作者 |倒序浏览
哪位高手愿意谈一下信号的使用?
程序中signal(SIGUSR1,test)接收到一次SIGUSR1信号后,要想继续响应SIGUSR1信号,是不是还要signal(SIGUSR1,test)一次啊?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2004-12-24 10:26 |只看该作者

哪位高手愿意谈一下信号的使用?

对于SIGUSR1这种信号,用signal函数是每次都要调用的
用sigaction函数只要调用一次

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
3 [报告]
发表于 2004-12-24 11:10 |只看该作者

哪位高手愿意谈一下信号的使用?

原帖由 "yuxh" 发表:
对于SIGUSR1这种信号,用signal函数是每次都要调用的
用sigaction函数只要调用一次


我记得答案试这样的,可不确定。试验了一下,似乎并不是这样的,怎么回事?

  1. [yangwl:/home/users50/yangwl/test/signal]$ vi test.c

  2. #include <stdio.h>;
  3. #include <stdlib.h>;
  4. #include <signal.h>;
  5. #include <unistd.h>;

  6. void sig1(int sig);

  7. int main(void)
  8. {
  9.         if (signal(SIGUSR1, sig1) == SIG_ERR) {
  10.                 perror("sig1 error");
  11.                 exit(1);
  12.         }
  13.         while (1) {
  14.                 pause();
  15.         }
  16.         exit(0);        // no use.
  17. }

  18. void sig1(int sig)
  19. {
  20.         printf("in sig1, %d\n", sig);
  21.         return ;
  22. }
  23. ~
  24. ~
  25. ~
  26. ~
  27. ~
  28. ~
  29. "test.c" 24L, 312C 已写入                                                         
  30. [yangwl:/home/users50/yangwl/test/signal]$ !g
  31. gcc test.c
  32. [yangwl:/home/users50/yangwl/test/signal]$ ./a.out &
  33. [1] 4892
  34. [yangwl:/home/users50/yangwl/test/signal]$ kill -USR1 4892
  35. in sig1, 10
  36. [yangwl:/home/users50/yangwl/test/signal]$ kill -USR1 4892
  37. in sig1, 10
  38. [yangwl:/home/users50/yangwl/test/signal]$ kill -USR1 4892
  39. in sig1, 10
  40. [yangwl:/home/users50/yangwl/test/signal]$ kill -USR1 4892
  41. in sig1, 10
  42. [yangwl:/home/users50/yangwl/test/signal]$ kill -USR1 4892
  43. in sig1, 10
  44. [yangwl:/home/users50/yangwl/test/signal]$ kill -USR1 4892
  45. in sig1, 10
  46. [yangwl:/home/users50/yangwl/test/signal]$ kill -USR1 4892
  47. in sig1, 10
  48. [yangwl:/home/users50/yangwl/test/signal]$ kill -USR1 4892
  49. in sig1, 10
  50. [yangwl:/home/users50/yangwl/test/signal]$ kill -USR1 4892
  51. in sig1, 10
  52. [yangwl:/home/users50/yangwl/test/signal]$ kill -USR1 4892
  53. in sig1, 10
  54. [yangwl:/home/users50/yangwl/test/signal]$ ps -ef | grep yangwl
  55. yangwl    1290  1288  0 Dec23 ?        00:00:00 /usr/sbin/sshd
  56. yangwl    1291  1290  0 Dec23 pts/19   00:00:00 -bash
  57. yangwl    4892  1291  0 13:33 pts/19   00:00:00 ./a.out
  58. yangwl    4921  1291  0 13:36 pts/19   00:00:00 ps -f -ef
  59. yangwl    4922  1291  0 13:36 pts/19   00:00:00 grep yangwl
  60. [yangwl:/home/users50/yangwl/test/signal]$ kill 4892
  61. [1]+  Terminated              ./a.out
  62. [yangwl:/home/users50/yangwl/test/signal]$ l
复制代码

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
4 [报告]
发表于 2004-12-24 11:23 |只看该作者

哪位高手愿意谈一下信号的使用?

与环境有关。
在UNIXWARE下只能发一次,第二次退出

所以对于自定义信号,还是用sigaction安全

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
5 [报告]
发表于 2004-12-24 11:24 |只看该作者

哪位高手愿意谈一下信号的使用?

linux下SIGUSR1=10?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
6 [报告]
发表于 2004-12-24 11:27 |只看该作者

哪位高手愿意谈一下信号的使用?

嗯。我用的是RH9。

  1. [yangwl:/home/users50/yangwl/test/signal]$ kill -l
  2. 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
  3. 5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
  4. 9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
  5. 13) SIGPIPE     14) SIGALRM     15) SIGTERM     17) SIGCHLD
  6. 18) SIGCONT     19) SIGSTOP     20) SIGTSTP     21) SIGTTIN
  7. 22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
  8. 26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO
  9. 30) SIGPWR      31) SIGSYS      32) SIGRTMIN    33) SIGRTMIN+1
  10. 34) SIGRTMIN+2  35) SIGRTMIN+3  36) SIGRTMIN+4  37) SIGRTMIN+5
  11. 38) SIGRTMIN+6  39) SIGRTMIN+7  40) SIGRTMIN+8  41) SIGRTMIN+9
  12. 42) SIGRTMIN+10 43) SIGRTMIN+11 44) SIGRTMIN+12 45) SIGRTMIN+13
  13. 46) SIGRTMIN+14 47) SIGRTMIN+15 48) SIGRTMAX-15 49) SIGRTMAX-14
  14. 50) SIGRTMAX-13 51) SIGRTMAX-12 52) SIGRTMAX-11 53) SIGRTMAX-10
  15. 54) SIGRTMAX-9  55) SIGRTMAX-8  56) SIGRTMAX-7  57) SIGRTMAX-6
  16. 58) SIGRTMAX-5  59) SIGRTMAX-4  60) SIGRTMAX-3  61) SIGRTMAX-2
  17. 62) SIGRTMAX-1  63) SIGRTMAX
  18. [yangwl:/home/users50/yangwl/test/signal]$
复制代码

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
7 [报告]
发表于 2004-12-24 11:32 |只看该作者

哪位高手愿意谈一下信号的使用?

看来RH9把SIGUSR1当成系统信号来处理了
UNIXWARE下是16号

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
8 [报告]
发表于 2004-12-24 11:34 |只看该作者

哪位高手愿意谈一下信号的使用?

有发现了一个问题!看看,下面,我第二次调用signal居然不好使了!怎么回事呢?

  1. [yangwl:/home/users50/yangwl/test/signal]$ cat test.c
  2. #include <stdio.h>;
  3. #include <stdlib.h>;
  4. #include <signal.h>;
  5. #include <unistd.h>;

  6. void sig1(int sig);
  7. void sig2(int sig);

  8. int main(void)
  9. {
  10.         void    (*funp)(int);
  11.         if (signal(SIGUSR1, sig1) == SIG_ERR) {
  12.                 printf("sig1 error!\n");
  13.                 exit(1);
  14.         }
  15.         if ((funp = signal(SIGUSR1, sig2)) == SIG_ERR) {
  16.                 printf("sig2 error!\n");
  17.                 exit(1);
  18.         }
  19.         funp(22);
  20.         while (1) {
  21.                 pause();
  22.         }
  23.         exit(0);        // no use.
  24. }

  25. void sig1(int sig)
  26. {
  27.         printf("in sig1, %d\n", sig);
  28.         return ;
  29. }

  30. void sig2(int sig)
  31. {
  32.         printf("in sig1, %d\n", sig);
  33.         return ;
  34. }
  35. [yangwl:/home/users50/yangwl/test/signal]$ gcc test.c
  36. [yangwl:/home/users50/yangwl/test/signal]$ ./a.out &
  37. [2] 5174
  38. in sig1, 22
  39. [yangwl:/home/users50/yangwl/test/signal]$ kill -USR1 5174
  40. in sig1, 10
  41. [yangwl:/home/users50/yangwl/test/signal]$
复制代码

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
9 [报告]
发表于 2004-12-24 11:44 |只看该作者

哪位高手愿意谈一下信号的使用?

不明白你是什么意思?
你只发了一个信号啊
第一次打印in sig1,22是
funp(22);调用sig1函数打印的,sig=22
第二次是sig2函数打印的,有什么问题吗?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
10 [报告]
发表于 2004-12-24 11:46 |只看该作者

哪位高手愿意谈一下信号的使用?

^_^,偶自己也发现了。丢脸了。那个sig2复制过来,里面没改,晕死。还以为没挂上呢。太丢脸了。不编辑了,让大家笑笑。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP