关于Linux信号可靠性的验证!!!大虾小虾请进

aa279686030 2012-05-20 03:02:00

#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
void new_op(int,siginfo_t*,void*);
int main(int argc,char**argv)
{
struct sigaction act;
int sig;
sig=atoi(argv[1]);

sigemptyset(&act.sa_mask);
act.sa_flags=SA_SIGINFO;
act.sa_sigaction=new_op;

if(sigaction(sig,&act,NULL) < 0)
{
printf("install sigal error\n");
}

while(1)
{
sleep(2);
printf("wait for the signal\n");
}
}
void new_op(int signum,siginfo_t *info,void *myact)
{
printf("receive signal %d", signum);
sleep(5);
}

说明,命令行参数为信号值,后台运行sigreceive signo &,可获得该进程的ID,假设为pid,然后再另一终端上运行kill -s signo pid验证信号的发送接收及处理。同时,可验证信号的排队问题。
这上面其实是一个帖子的内容,网址在这http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index2.html
我想问的是,我的信号编号都是小于SIGRTMIN的,也就是不可靠信号,按理说,应该是发送多次,但只会响应一次的。但是我实验的结果是发送了三次,响应了2次,不知大虾能否解释一下,感激不尽!!!大虾 是在没有很多分了。。。。。

实验结果如下:
其中一个终端上的
[user@MagicLinux APUE]$ ./a.out 3 &
[1] 24336
[user@MagicLinux APUE]$ wait for the signal
wait for the signal
wait for the signal
wait for the signal
wait for the signal
wait for the signal
receive signal 3receive signal 3wait for the signal
wait for the signal
wait for the signal
wait for the signal
wait for the signal

另外一个终端
[user@MagicLinux ~]$ kill -s 3 24336
[user@MagicLinux ~]$ kill -s 3 24336
[user@MagicLinux ~]$ kill -s 3 24336
[user@MagicLinux ~]$ kill 24336
[user@MagicLinux ~]$



...全文
91 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2012-05-20
  • 打赏
  • 举报
回复
楼主这几个概念混淆了,如果当前线程已经接受到一个信号A,并且还没有处理,那么再来1个信号A会被抛弃。而不是说处理过一个信号A,这个线程以后再也不处理信号A了,这是错误的认识。 一个信号被一个线程接受,但尚未调用信号处理函数的情况下,这叫做排队了。 一个信号A已经排队了,那么再来信号A不会入队。如果一个信号A正在被信号函数处理,那么默认是添加该信号的掩码的,这时候再来一个信号A,因为队里已经没有A了,所以这个A又排队了,信号函数结束以后会再处理这个新来的信号A。如果当前线程没有A排队,也没有正在处理A,那么投递来的A就被排队了,阻塞或者没阻塞该信号与排队无关,只不过阻塞的话不会被信号函数处理。

一句话:只要一个信号A投递到一个线程,也就是Kill,sigqueue返回了,那么信号A就被那个线程排队了,至于哪时候信号A被那个线程处理,我们不知道。如果我们在该信号A还在排队的时候重复发这个信号A过去,这些信号A都被抛弃掉,只保留最初的1个A。

我也查了一下,说是SIGRTMIN-SIGRTMAX之间的信号属于实时信号,可以被排队。
楼主使用的不是实时信号,丢失一个就很正常了。


69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧