signal 和 sigaction 函数_MQ, Tuxedo及OLTP讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MQ, Tuxedo及OLTP讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3476 | 回复: 0   主题: signal 和 sigaction 函数        下一篇 
shijian111
注册用户
等级:新兵
经验:46
发帖:58
精华:0
注册:2012-2-15
状态:离线
发送短消息息给shijian111 加好友    发送短消息息给shijian111 发消息
发表于: IP:您无权察看 2014-9-29 9:18:20 | [全部帖] [楼主帖] 楼主

关于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);
int
main(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);
      }
}
void
pr_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;
}




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论