如有错误,欢迎批评指正,本人也是才学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