免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3990 | 回复: 7
打印 上一主题 下一主题

linux下面的信号都已经是"可靠信号"了吗,已经没有了不可靠信号? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-18 09:12 |只看该作者 |倒序浏览
如题,apue里面说的"不可靠信号"的讲法是不是都已经过时了,现在linux(>2.6版本)信号都是可靠信号呢?

论坛徽章:
0
2 [报告]
发表于 2012-06-18 09:40 |只看该作者
小于SIGRTMIN为不可靠信号。SIGRTMIN-SIGRTMAX的为可靠信号。使用kill -l查询      
Ubuntu 12.04LTS
因为小于SIGRTMAX的信号都是早期就定义了的,为了兼容性,后来的posix并没有改变他们的不可靠性。
1) SIGHUP         2) SIGINT         3) SIGQUIT         4) SIGILL         5) SIGTRAP
6) SIGABRT         7) SIGBUS          SIGFPE         9) SIGKILL        10) SIGUSR1
11) SIGSEGV        12) SIGUSR2        13) SIGPIPE        14) SIGALRM        15) SIGTERM
16) SIGSTKFLT        17) SIGCHLD        1 SIGCONT        19) SIGSTOP        20) SIGTSTP
21) SIGTTIN        22) SIGTTOU        23) SIGURG        24) SIGXCPU        25) SIGXFSZ
26) SIGVTALRM        27) SIGPROF        2 SIGWINCH        29) SIGIO        30) SIGPWR
31) SIGSYS
只是又定义了一组可靠信号(没有32-33):34) SIGRTMIN        35) SIGRTMIN+1        36) SIGRTMIN+2        37) SIGRTMIN+3
3 SIGRTMIN+4        39) SIGRTMIN+5        40) SIGRTMIN+6        41) SIGRTMIN+7        42) SIGRTMIN+8
43) SIGRTMIN+9        44) SIGRTMIN+10        45) SIGRTMIN+11        46) SIGRTMIN+12        47) SIGRTMIN+13
4 SIGRTMIN+14        49) SIGRTMIN+15        50) SIGRTMAX-14        51) SIGRTMAX-13        52) SIGRTMAX-12
53) SIGRTMAX-11        54) SIGRTMAX-10        55) SIGRTMAX-9        56) SIGRTMAX-8        57) SIGRTMAX-7
5 SIGRTMAX-6        59) SIGRTMAX-5        60) SIGRTMAX-4        61) SIGRTMAX-3        62) SIGRTMAX-2
63) SIGRTMAX-1        64) SIGRTMAX       

不可靠信号和可靠信号的差别主要在于,当连续多个信号相同信号被递送时:可靠信号会排除,不可靠信号会把相同信号合为1个信号 。
比如有三个信号连续递送给某一进程: sig1, sig1 , sig1
那么如果sig1为不可靠信号,则此进程只会发生一次中断。只有一个sig1递送,其它两个sig1丢失,所以叫不可靠信号。
如果sig1为可靠信号,那么此进程会出现三次中断。三个sig1排队递送了。所以称为可靠信号。

论坛徽章:
0
3 [报告]
发表于 2012-06-18 16:26 |只看该作者
fdl19881 发表于 2012-06-18 09:40
小于SIGRTMIN为不可靠信号。SIGRTMIN-SIGRTMAX的为可靠信号。使用kill -l查询      
Ubuntu 12.04LTS
因为 ...


也就是排队和不排队的区别!

论坛徽章:
0
4 [报告]
发表于 2012-06-18 17:37 |只看该作者
回复 3# hongxinzha


举个例子:
    如果使用了sigprocmask阻塞了比如SIGUSR1信号(不可靠信号)的,然后在我解开阻塞前,有进程向我发送了3次SIGUSR1.这时SIGUSR1会处于阻塞状态。
当用sigprocmask将SIGUSR1解阻塞时,只会调用1次SIGUSR1的信号处理程序, 不是3次。 (即发生丢失,所以称为不可靠的)
如果换成可靠信号,则该信号处理程序会调用3次。不会出现丢失的情况

这应该是最大区别吧。 。   

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
5 [报告]
发表于 2012-06-19 21:03 |只看该作者
不是吧,排队说的是实时信号。不可靠信号应该是说老式系统里执行信号处理函数时把信号与处理系统间的关系自动解除了。

论坛徽章:
0
6 [报告]
发表于 2012-06-19 22:29 |只看该作者
本帖最后由 fdl19881 于 2012-06-19 22:31 编辑

回复 5# tempname2

不可靠信号只是对不同的信号才排除,对相同信号会合并成一个(这就叫信号丢失)。想想sigpromask的作用。
可靠信号是完全支持排除的。


  
你也说了是老式系统才会每次响应信号后就后解除原来的信号处理程序。 那新式系统呢?  这个也就不能称为实时信号和非可靠信号的区别了。

自己运行下:
#include <signal.h>
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

void sig_handle(int signo)
{
        char msg[] = "catch signal SIGUSR1\n";
        if(signo == SIGUSR1)
          write(STDOUT_FILENO , msg , strlen(msg));
}

int main(void)
{
        pid_t pid;
        int i;
        printf("before fork:\n");
        if((pid = fork()) < 0) {
                perror("fork error");
                exit(-1);
        } else if(pid == 0) {
                if(signal(SIGUSR1 , sig_handle) == SIG_ERR) {
                        perror("signal error");
                        _exit(-1);
                }
                while(1)
                  pause();
                _exit(0);
        }

        sleep(1);
        for(i = 0; i < 5 ; i++) {
                kill(pid , SIGUSR1);
                sleep(1);
        }
        kill(pid , SIGTERM);
        if(wait(NULL) < 0) {
                perror("wait error");
                exit(-1);
        }

        exit(0);
}

论坛徽章:
0
7 [报告]
发表于 2012-06-19 22:32 |只看该作者
环境ubuntu 12.04 LTS

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
8 [报告]
发表于 2012-06-20 10:40 |只看该作者
回复 6# fdl19881


可能是我看的资料太久远了,加上很久没写过用户态程序,概念有些模糊。现在没有环境,不好试你的代码,但我印象中,现代的类Unix系统里用signal注册的信号处理函数仍是“不可靠”的,它底层是用sigaction加上设置ONE_SHOT标志实现的,跟老式系统的行为一样。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP