程序代碼:
#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