출력이 파일로 리디렉션 될 때 printf () 및 system ()의 결과가 잘못된 순서로 표시됨 [중복]
이 질문에 이미 답변이 있습니다.
myprogram이라는 실행 파일로 컴파일되는 C 프로그램이 있습니다. 이것이 주요 기능입니다.
int main(int argc, char ** argv) {
printf("this is a test message.\n");
system("ls");
return 0;
}
myprogram > output.txt
Linux 셸에서 실행 한 다음 output.txt를 검사하면 ls
위에 나열된 "이것은 테스트 메시지입니다."라는 출력이 표시됩니다.
그 반대가되어야한다고 생각합니다. 이 문제가 발생하는 이유는 무엇이며 "이것은 테스트 메시지입니다"가 output.txt 상단에 표시되도록하려면 어떻게해야합니까?
중요한 경우 C와 명령 줄 작업을 처음 접합니다.
디폴트에 의해 출력은 stdout
인 라인 버퍼 단자에 연결되었을 때. 즉, 버퍼가 가득 차거나 줄 바꿈을 추가하면 버퍼가 플러시됩니다.
그러나 , 경우는stdout
파일로 프로그램의 출력을 리디렉션 할 때 무슨 일이 후, 일이 같은 터미널에 연결되어 있지stdout
된다 완전 버퍼 . 즉, 버퍼가 가득 차거나 명시 적으로 플러시 될 때 (프로그램이 종료 될 때 발생) 실제로 버퍼가 플러시되고 기록됩니다.
즉, 코드에서 시작된 별도의 프로세스의 출력 (예 :을 호출 할 때 발생하는 작업 system
)이 가장 먼저 작성 될 가능성이 큽니다. 해당 프로세스의 버퍼는 해당 프로세스가 종료 될 때 즉 자신의 프로세스 이전에 플러시되기 때문입니다.
리디렉션 (또는 해당 문제에 대한 파이프)을 사용하면 어떻게 되나요?
- 귀하의
printf
호출은에 기록stdout
버퍼. - 이
system
함수는 자체 버퍼에 쓰는 새 프로세스를 시작합니다. system
호출로 시작된 외부 프로세스가 종료되면 해당 버퍼가 플러시되고 기록됩니다. 자신의 프로세스에있는 자신의 버퍼는 건드리지 않습니다.- 자체 프로세스가 종료되고
stdout
버퍼가 플러시되고 기록됩니다.
"올바른"(또는 최소한 예상되는) 순서로 출력을 얻으려면을 호출 fflush
하기 전에 호출 하거나 system
명시 적으로 플러시 stdout
하거나 setbuf
출력 전에 호출 하여 버퍼링을 완전히 비활성화하십시오.
출력 버퍼링과 관련이 있습니다. 나는 같은 행동을 재현 할 수 있었다. 플러시를 강요하는 것이 나를 위해 해냈습니다.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char ** argv) {
printf("this is a test message.\n");
fflush(stdout);
system("ls");
return 0;
}
플러시를 추가하기 전에 :
$ ./main > foo
$ cat foo
main
main.c
this is a test message.
이후 :
$ ./main > foo
$ cat foo
this is a test message.
foo
main
main.c
I suspect it's because of the order in which the stdout buffer gets flushed, which is not necessarily deterministic. It's possible that the parent spawns the ls
process and doesn't flush its own stdout until after that returns. It may not actually flush stdout until the process exits.
Try adding fflush (stdout)
after the printf statement and see if that forces the output to appear first.
'programing tip' 카테고리의 다른 글
'인스턴스로 전송 된 인식 할 수없는 선택기'오류를 디버그하려면 어떻게해야합니까? (0) | 2020.08.22 |
---|---|
Angular2 오류 : "exportAs"가 "ngForm"으로 설정된 지시문이 없습니다. (0) | 2020.08.22 |
죄와 cos를 함께 계산하는 가장 빠른 방법은 무엇입니까? (0) | 2020.08.22 |
Qt가 모델 / 뷰 용어를 오용하는 이유는 무엇입니까? (0) | 2020.08.22 |
libxml / tree.h 해당 파일 또는 디렉토리 없음 (0) | 2020.08.21 |