APUE第三版 程序 10-2 (捕捉 SIGUSR1 和 SIGUSR2 的簡單程序) +自己沙掉踩得坑(注意緩衝方式)

程序代碼:

#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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章