출력이 파일로 리다이렉트되면 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 쉘에서 출력을 검사합니다.txt, 출력은 다음과 같습니다.ls
테스트 메시지입니다."
그 반대로 해야 할 것 같아요.이 현상이 발생하는 이유와 어떻게 하면 output.txt 상단에 "this is test message"가 표시될 수 있습니까?
만약 그게 문제가 된다면, 나는 C에 처음이고 명령줄에서 일합니다.
디폴트 출력은stdout
는 단말기에 접속되어 있을 때 회선으로 제어됩니다.즉, 버퍼가 가득 차거나 새 행을 추가하면 버퍼가 플러시됩니다.
단, 만약stdout
프로그램 출력을 파일로 리다이렉트 했을 때처럼 단말기에 접속되어 있지 않습니다.stdout
완전 버퍼가 됩니다.즉, 버퍼가 가득 찼을 때 또는 명시적으로 플러시되었을 때 버퍼가 플러시되고 실제로 쓰여집니다(프로그램이 종료될 때 발생).
즉, 개별 프로세스의 출력이 코드로부터 개시된 것을 의미합니다(예를 들어, 콜했을 때에 발생하는 현상).system
프로세스 종료 시(자신의 프로세스 전)에 프로세스의 버퍼가 플래시되기 때문에)가 먼저 작성될 가능성이 높습니다.
리다이렉션(또는 그 문제의 파이프)을 사용하는 경우의 동작:
- 당신의.
printf
에의 콜 기입stdout
버퍼링합니다. - 그
system
함수는 자신의 버퍼에 쓰는 새로운 프로세스를 시작합니다. - 외부 프로세스(에 의해 시작됨)
system
call)을 종료하면 버퍼가 플래시되어 기입됩니다.자신의 프로세스에서 버퍼는 건드리지 않습니다. - 사용자 자신의 프로세스가 종료되고
stdout
버퍼가 플래시되어 기입됩니다.
「올바른」(또는 적어도 예상한) 순서로 출력을 취득하려면 , 콜 하기 전에 콜 해 주세요.system
명시적으로 플러시하다)stdout
또는 출력 전에 콜하여 버퍼링을 완전히 디세블로 합니다.
출력 버퍼링과 관련되어 있습니다.나는 간신히 같은 행동을 재현했다.강제로 플러시를 한 게 날 위해 한 일이야
#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;
}
fflush를 추가하기 전에:
$ ./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
것 확정적인 것은 아닙니다stdout 버퍼가 플러시 되는 것은 .가 를 낳을 있다ls
처리하여 그 후가 반환될 때까지 자신의 stdout을 플러시하지 않습니다.프로세스가 종료될 때까지 실제로는 stdout을 플러시하지 않을 수 있습니다.
번 더 써보세요.fflush (stdout)
에, .printf 에 으로 표시되는지 여부를 합니다.
언급URL : https://stackoverflow.com/questions/52534629/results-of-printf-and-system-are-in-the-wrong-order-when-output-is-redirecte
'source' 카테고리의 다른 글
VSCode -- Python 프로그램을 디버깅하기 위한 작업 디렉토리를 설정하는 방법 (0) | 2022.10.23 |
---|---|
MySQL - 열이 이미 있습니다: 1060 중복된 열 이름 '1' (0) | 2022.10.23 |
출력 버퍼링 사용 안 함 (0) | 2022.10.23 |
MariaDB는 그룹화 시 SELECT 문의 기능 의존성을 지원하지 않습니까? (0) | 2022.10.23 |
요구 페이로드 취득 방법 (0) | 2022.10.23 |