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指向的函數。 |