yuxh 回复于:2004-12-24 10:26:03 |
对于SIGUSR1这种信号,用signal函数是每次都要调用的
用sigaction函数只要调用一次 |
aero 回复于:2004-12-24 11:10:00 |
[quote:91058ff127="yuxh"]对于SIGUSR1这种信号,用signal函数是每次都要调用的
用sigaction函数只要调用一次[/quote:91058ff127] 我记得答案试这样的,可不确定。试验了一下,似乎并不是这样的,怎么回事? [code:1:91058ff127] [yangwl:/home/users50/yangwl/test/signal]$ vi test.c #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <unistd.h> void sig1(int sig); int main(void) { if (signal(SIGUSR1, sig1) == SIG_ERR) { perror("sig1 error"); exit(1); } while (1) { pause(); } exit(0); // no use. } void sig1(int sig) { printf("in sig1, %d\n", sig); return ; } ~ ~ ~ ~ ~ ~ "test.c" 24L, 312C ÒÑдÈë [yangwl:/home/users50/yangwl/test/signal]$ !g gcc test.c [yangwl:/home/users50/yangwl/test/signal]$ ./a.out & [1] 4892 [yangwl:/home/users50/yangwl/test/signal]$ kill -USR1 4892 in sig1, 10 [yangwl:/home/users50/yangwl/test/signal]$ kill -USR1 4892 in sig1, 10 [yangwl:/home/users50/yangwl/test/signal]$ kill -USR1 4892 in sig1, 10 [yangwl:/home/users50/yangwl/test/signal]$ kill -USR1 4892 in sig1, 10 [yangwl:/home/users50/yangwl/test/signal]$ kill -USR1 4892 in sig1, 10 [yangwl:/home/users50/yangwl/test/signal]$ kill -USR1 4892 in sig1, 10 [yangwl:/home/users50/yangwl/test/signal]$ kill -USR1 4892 in sig1, 10 [yangwl:/home/users50/yangwl/test/signal]$ kill -USR1 4892 in sig1, 10 [yangwl:/home/users50/yangwl/test/signal]$ kill -USR1 4892 in sig1, 10 [yangwl:/home/users50/yangwl/test/signal]$ kill -USR1 4892 in sig1, 10 [yangwl:/home/users50/yangwl/test/signal]$ ps -ef | grep yangwl yangwl 1290 1288 0 Dec23 ? 00:00:00 /usr/sbin/sshd yangwl 1291 1290 0 Dec23 pts/19 00:00:00 -bash yangwl 4892 1291 0 13:33 pts/19 00:00:00 ./a.out yangwl 4921 1291 0 13:36 pts/19 00:00:00 ps -f -ef yangwl 4922 1291 0 13:36 pts/19 00:00:00 grep yangwl [yangwl:/home/users50/yangwl/test/signal]$ kill 4892 [1]+ Terminated ./a.out [yangwl:/home/users50/yangwl/test/signal]$ l [/code:1:91058ff127] |
yuxh 回复于:2004-12-24 11:23:28 |
与环境有关。
在UNIXWARE下只能发一次,第二次退出 所以对于自定义信号,还是用sigaction安全 |
yuxh 回复于:2004-12-24 11:24:51 |
linux下SIGUSR1=10? |
aero 回复于:2004-12-24 11:27:13 |
嗯。我用的是RH9。
[code:1:11157874a8] [yangwl:/home/users50/yangwl/test/signal]$ kill -l 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 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 32) SIGRTMIN 33) SIGRTMIN+1 34) SIGRTMIN+2 35) SIGRTMIN+3 36) SIGRTMIN+4 37) SIGRTMIN+5 38) SIGRTMIN+6 39) SIGRTMIN+7 40) SIGRTMIN+8 41) SIGRTMIN+9 42) SIGRTMIN+10 43) SIGRTMIN+11 44) SIGRTMIN+12 45) SIGRTMIN+13 46) SIGRTMIN+14 47) SIGRTMIN+15 48) SIGRTMAX-15 49) SIGRTMAX-14 50) SIGRTMAX-13 51) SIGRTMAX-12 52) SIGRTMAX-11 53) SIGRTMAX-10 54) SIGRTMAX-9 55) SIGRTMAX-8 56) SIGRTMAX-7 57) SIGRTMAX-6 58) SIGRTMAX-5 59) SIGRTMAX-4 60) SIGRTMAX-3 61) SIGRTMAX-2 62) SIGRTMAX-1 63) SIGRTMAX [yangwl:/home/users50/yangwl/test/signal]$ [/code:1:11157874a8] |
yuxh 回复于:2004-12-24 11:32:04 |
看来RH9把SIGUSR1当成系统信号来处理了
UNIXWARE下是16号 |
aero 回复于:2004-12-24 11:34:07 |
有发现了一个问题!看看,下面,我第二次调用signal居然不好使了!怎么回事呢?
[code:1:7482f7f240] [yangwl:/home/users50/yangwl/test/signal]$ cat test.c #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <unistd.h> void sig1(int sig); void sig2(int sig); int main(void) { void (*funp)(int); if (signal(SIGUSR1, sig1) == SIG_ERR) { printf("sig1 error!\n"); exit(1); } if ((funp = signal(SIGUSR1, sig2)) == SIG_ERR) { printf("sig2 error!\n"); exit(1); } funp(22); while (1) { pause(); } exit(0); // no use. } void sig1(int sig) { printf("in sig1, %d\n", sig); return ; } void sig2(int sig) { printf("in sig1, %d\n", sig); return ; } [yangwl:/home/users50/yangwl/test/signal]$ gcc test.c [yangwl:/home/users50/yangwl/test/signal]$ ./a.out & [2] 5174 in sig1, 22 [yangwl:/home/users50/yangwl/test/signal]$ kill -USR1 5174 in sig1, 10 [yangwl:/home/users50/yangwl/test/signal]$ [/code:1:7482f7f240] |
yuxh 回复于:2004-12-24 11:44:10 |
不明白你是什么意思?
你只发了一个信号啊 第一次打印in sig1,22是 funp(22);调用sig1函数打印的,sig=22 第二次是sig2函数打印的,有什么问题吗? |
aero 回复于:2004-12-24 11:46:43 |
^_^,偶自己也发现了。丢脸了。那个sig2复制过来,里面没改,晕死。还以为没挂上呢。太丢脸了。不编辑了,让大家笑笑。 |
greatchoice 回复于:2004-12-24 13:48:24 |
看了大家的讨论,我受益匪浅!希望大家对信号的讨论继续下去。 |
jkjium 回复于:2004-12-25 23:21:29 |
unix高级编程里提到过,signal()在某些系统里只改变一次信号行为,然后就恢复系统默认。用sigaction就可以了。linux下signal可以永久改变信号行为,solaris中就不行了,要想永久改变可以调用sigaction或sigset |
大雪飞扬 回复于:2004-12-26 11:57:39 |
[quote:542c342fc0="aero"][/quote:542c342fc0]
问一下,funp声明和funp(22)调用是什么意思,在这里有什么作用? |
aero 回复于:2004-12-27 08:47:44 |
funp的声明是将它定义成一个指向一个函数的指针。
funp(22),是调用funp指向的函数。 |