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

发表于:2007-05-25来源:作者:点击数: 标签:愿意哪位号的一下高手
哪位高手愿意谈一下信号的使用? 程序中signal(SIGUSR1,test)接收到一次SIGUSR1信号后,要想继续响应SIGUSR1信号,是不是还要signal(SIGUSR1,test)一次啊? yuxh 回复于:2004-12-24 10:26:03 对于SIGUSR1这种信号,用signal函数是每次都要调用的 用sigactio

哪位高手愿意谈一下信号的使用?
程序中signal(SIGUSR1,test)接收到一次SIGUSR1信号后,要想继续响应SIGUSR1信号,是不是还要signal(SIGUSR1,test)一次啊?

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

原文转自:http://www.ltesting.net

评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)