如何摆脱信号处理程序中printf的虚假输出?

时间:2017-04-08 17:14:11

标签: c printf signals

考虑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缓冲区。 似乎无法使用fseekfflush完成此操作。

0 个答案:

没有答案