APUE第三版 程序 10-2 (捕捉 SIGUSR1 和 SIGUSR2 的简单程序) +自己沙掉踩得坑(注意缓冲方式)

如有错误,欢迎批评指正,本人也是才学APUE的菜鸟

程序代码:

#include "apue.h"

static void sig_usr(int);	// on handler for both signals

int main(void) {
	if(signal(SIGUSR1, sig_usr) == SIG_ERR)
		err_sys("can't catch SIGUSR1");
	if(signal(SIGUSR2, sig_usr) == SIG_ERR)
		err_sys("can't catch SIGUSR2");
	for( ; ; )
		pause();
}

static void sig_usr(int signo) {
	if(signo == SIGUSR1)
		printf("received SIGUSR1\n");
	else if(signo == SIGUSR2)
		printf("received SIGUSR2\n");
	else
		err_dump("received signal %d\n", signo);
}

 
 
起初:在 printf 的输出中打掉了 \n 符号,便一直是以下情况

hjm@hjm-Inspiron:~/InterviewPreparation/apue/Examples/10-2$ ./10-2 &
[2] 22870
hjm@hjm-Inspiron:~/InterviewPreparation/apue/Examples/10-2$ kill -USR1 22870
hjm@hjm-Inspiron:~/InterviewPreparation/apue/Examples/10-2$ kill -USR2 22870
hjm@hjm-Inspiron:~/InterviewPreparation/apue/Examples/10-2$ kill 22870

紧接着: 我又试着把程序的输出放到文件里面

hjm@hjm-Inspiron:~/InterviewPreparation/apue/Examples/10-2$ ./10-2 >temp.foo &
[2] 23440
hjm@hjm-Inspiron:~/InterviewPreparation/apue/Examples/10-2$ kill -USR1 23440
hjm@hjm-Inspiron:~/InterviewPreparation/apue/Examples/10-2$ kill -USR2 23440
hjm@hjm-Inspiron:~/InterviewPreparation/apue/Examples/10-2$ kill 23440
hjm@hjm-Inspiron:~/InterviewPreparation/apue/Examples/10-2$ cat temp.foo
hjm@hjm-Inspiron:~/InterviewPreparation/apue/Examples/10-2$ 

cat 查看了文件,居然还是没有输出。。。。
 
 
  当我找到这个沙掉Bug后,一下就想通了。我是用 kill 终止的进程,而无论是在第一种情况下,还是在第二种情况下,输出都在缓冲区,直接 kill 就没有输出。加上换行后,第一种情况就有输出,因为是行缓存的,有换行符就会冲洗缓冲区。 所以,这种情况下,如果输出到文件,同样会发现文件没有内容,因为重定向到文件时,采用的是全缓冲形式。

 
最后的程序输出:

hjm@hjm-Inspiron:~/InterviewPreparation/apue/Examples/10-2$ ./10-2 &
[2] 23514
hjm@hjm-Inspiron:~/InterviewPreparation/apue/Examples/10-2$ kill -USR1 23514
received SIGUSR1
hjm@hjm-Inspiron:~/InterviewPreparation/apue/Examples/10-2$ kill -USR2 23514
received SIGUSR2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值