signal 和 sigaction 函数

来源:互联网 发布:鬼冢虎淘宝是正品吗 编辑:程序博客网 时间:2024/04/28 00:35
关于signal 函数和  sigaction 函数的区别

注意 :
    <1> sigaction
    *一般用法:
          19
     20     phan.sa_handler = &sig_handler;
     21     sigemptyset(&phan.sa_mask);
     23     phan.sa_flags = 0;   或 //phan.sa_flags = SA_RESTART; 其效果和signal 一样
     24     sigaction(SIGALRM, &phan, NULL);



     *注意
        一般不是重启动的函数,除非把sa_flag=SA_RESTART. 也就是说当信号到来,中断其阻塞的I/O操作,或其他阻塞的操作时,
他们会自动启动这些操作,而不会中断这些操作.而这些I/O操作会保持原来的阻塞状态就好好象根本没有信号到来一样.
   
     <2>signal
       函数是重启动的,当使用该函数安装信号处理函数时,其阻塞的操作将会被中断

      实际使用例子:

    
/* * test for alarm  */#include "apue.h"void sig_handler(int signo);void sig_handler2(int signo);void pr_mask(const char *str);intmain(void){int i;struct sigaction phan;char str[100] = {'/0'};//phan.sa_handler = &sig_handler2;phan.sa_handler = &sig_handler;sigemptyset(&phan.sa_mask);//phan.sa_flags = SA_RESTART;  //如果使用这一行,将会阻塞在read函数phan.sa_flags = 0;sigaction(SIGALRM, &phan, NULL);//signal(SIGALRM, sig_handler2);for(i=0;;i++){alarm(3);fprintf(stderr, "do something/n");read(STDIN_FILENO, str, sizeof(str));fprintf(stderr, "[%d] done/n", i);//alarm(0);//pause();}return(0);}void sig_handler(int signo){struct sigaction phan;switch(signo){case SIGALRM: 
                        //如果下面的函数将会阻塞在read函数.因为它会让阻塞的操作自动重启动  
        //signal(SIGALRM, sig_handler);phan.sa_handler = &sig_handler;sigemptyset(&phan.sa_mask);phan.sa_flags = 0;sigaction(SIGALRM, &phan, NULL);pr_mask("sig_handler : "); //打印出信号掩码fprintf(stderr, "time out/n");break;default:fprintf(stderr, "[%d] ignores/n", signo);}}void sig_handler2(int signo){switch(signo){case SIGALRM:fprintf(stderr, "time out/n");break;default:fprintf(stderr, "[%d] ignores/n", signo);}}voidpr_mask(const char *str){ sigset_t sigset; int errno_save; errno_save = errno; /* we can be called by signal handlers */ if (sigprocmask(0, NULL, &sigset) < 0){ fprintf(stderr, "sigprocmask error");exit(1);} printf("%s", str); if (sigismember(&sigset, SIGINT)) printf("SIGINT "); if (sigismember(&sigset, SIGQUIT)) printf("SIGQUIT "); if (sigismember(&sigset, SIGUSR1)) printf("SIGUSR1 "); if (sigismember(&sigset, SIGALRM)) printf("SIGALRM "); /* remaining signals can go here */ printf("/n"); errno = errno_save;}