2010-03-10 4 views
2
#include<stdio.h> 
#include<signal.h> 
#include<stdlib.h> 
void handler(int signo) 
{ 
    printf("First statement"); 
    system("date"); 
    exit(EXIT_SUCCESS); 
} 

int main() 
{ 
    signal(SIGINT,handler); 
    printf("Waiting for KeyboardInterrupt\n"); 
    for(;;); 
    return 0; 
} 

테스트 실행을 호출 삭제하기 없습니다 : -표준 버퍼 시스템 전에()

[email protected]:~/c$ gcc main.c 
[email protected]:~/c$ ./a.out 
Waiting for KeyboardInterrupt 
^CWed Mar 10 23:55:47 IST 2010 
First [email protected]:~/c$ 

시스템 후 인쇄하기 "첫 번째 문"는()를 호출?

답변

3

당신의 프로세스가 시작될 때 입력, 출력 및 오류 스트림이 생성 표준, 이 경우 C 프로그램입니다. 시스템 콜을 할 때, date 명령을 실행하기위한 또 다른 프로세스가 생성되고, 그것은 자신의 스트림 세트를 얻습니다. 프로그램에서

는 printf와 출력 C는 프로그램의 표준 출력 스트림에 버퍼링된다. 그런 다음 날짜 출력은 자체 표준 출력 스트림에 버퍼링됩니다. 시스템 호출이 끝나면 날짜 표준 출력 스트림이 플러시되므로 출력을 볼 수 있습니다. 그런 다음 C 프로그램이 끝나면 표준 출력 스트림이 플러시되고 printf 출력이 표시됩니다.

이 사람의 게시물이 도움이 될 수 : http://www.pixelbeat.org/programming/stdio_buffering/

+0

thats what i want .. :) –

2

시스템 ("날짜")을 호출하기 전에 버퍼를 플러시 하시겠습니까?

난 그냥 system 전에 fflush(NULL);을 추가하고, 출력이 예상되고있다.

+0

야합니다. 나는 이것을 안다. 그러나 여전히 @Mike로부터 올바른 해결책을 얻었다. –

+0

'fflush (NULL)'은 * ALL * 버퍼를 없애고, 그래서 누가 어떤 버퍼를 가지고 있든지 상관 없다. 특정 인수가있는 fflush는 해당 버퍼 만 플러시합니다. – rmk

1

C IO API는 작업을보다 효율적으로 인쇄하기 위해 버퍼링합니다. 일반적으로 버퍼는 개행을 쓰거나 수동으로 플러시 할 때마다 비워집니다.

그래서 당신은 버퍼 플러시 개행 문자를 사용할 수 있습니다

printf("First statement\n"); 

을 또는 FFLUSH 기능을 사용

printf("First statement"); 
fflush (stdout); 
+1

"\ n"을 추가하는 것은 항상 (예 : stdout이 파일로 리디렉션되는 경우) 늘리는 것은 아닙니다. 'fflush'가됩니다. –

+0

실제로, 나는 이런 일이 일어난다. 그러나, 나의 @Mike가 말했듯이, STDOUT이 플러시되지 않았다는 것을 알게되었다. bcos "date"명령은 또 다른 STDOUT 스트림을 가지고있다. –

관련 문제