考虑SIGINT
的这个信号处理程序:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <setjmp.h>
static sigjmp_buf env_buffer;
void sig_handler(int signo) {
if (signo == SIGINT) {
//fseek( stdout, 0, SEEK_END );
//fflush(stdout);
printf( "Interrupted by user!\n" );
siglongjmp( env_buffer, signo );
}
}
int main(void) {
struct sigaction sa;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sa.sa_handler = sig_handler;
if (sigaction(SIGINT, &sa, NULL) == -1) {
printf("sigaction failed\n");
exit(1);
}
int val = sigsetjmp( env_buffer, 1 );
if ( val != 0 ) {
printf( "exit main()..\n" );
return 1;
}
for( int i=0; ; i++ ) {
printf( "%d\n", i % 10);
}
return 0;
}
输出:
[...]
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
^C5
Interrupted by user!
exit main()..
问题:
^C
之后写一个整数(这里:5)?看来这个数字是0到9之间的随机数。我想我必须以某种方式擦除stdout
缓冲区。
似乎无法使用fseek
或fflush
完成此操作。