• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 哪位高手愿意談一下信號的使用?

    發表于: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.kjueaiud.com

    評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>