source

출력이 파일로 리다이렉트되면 printf() 및 system()의 결과가 잘못된 순서로 나타난다.

factcode 2022. 10. 23. 09:58
반응형

출력이 파일로 리다이렉트되면 printf() 및 system()의 결과가 잘못된 순서로 나타난다.

나는 myprogram이라는 실행 파일로 컴파일하는 C 프로그램을 가지고 있다.주요 기능은 다음과 같습니다.

int main(int argc, char ** argv) {
  printf("this is a test message.\n");
  system("ls");

  return 0;
}

내가 달릴 때myprogram > output.txtLinux 쉘에서 출력을 검사합니다.txt, 출력은 다음과 같습니다.ls테스트 메시지입니다."

그 반대로 해야 할 것 같아요.이 현상이 발생하는 이유와 어떻게 하면 output.txt 상단에 "this is test message"가 표시될 수 있습니까?

만약 그게 문제가 된다면, 나는 C에 처음이고 명령줄에서 일합니다.

디폴트 출력은stdout는 단말기에 접속되어 있을 때 회선으로 제어됩니다.즉, 버퍼가 가득 차거나 새 행을 추가하면 버퍼가 플러시됩니다.

, 만약stdout프로그램 출력을 파일로 리다이렉트 했을 때처럼 단말기에 접속되어 있지 않습니다.stdout완전 버퍼가 됩니다.즉, 버퍼가 가득 찼을 때 또는 명시적으로 플러시되었을 때 버퍼가 플러시되고 실제로 쓰여집니다(프로그램이 종료될 때 발생).

즉, 개별 프로세스의 출력이 코드로부터 개시된 것을 의미합니다(예를 들어, 콜했을 때에 발생하는 현상).system프로세스 종료 시(자신의 프로세스 전)에 프로세스의 버퍼가 플래시되기 때문에)가 먼저 작성될 가능성이 높습니다.

리다이렉션(또는 그 문제의 파이프)을 사용하는 경우의 동작:

  1. 당신의.printf에의 콜 기입stdout버퍼링합니다.
  2. system함수는 자신의 버퍼에 쓰는 새로운 프로세스를 시작합니다.
  3. 외부 프로세스(에 의해 시작됨)systemcall)을 종료하면 버퍼가 플래시되어 기입됩니다.자신의 프로세스에서 버퍼는 건드리지 않습니다.
  4. 사용자 자신의 프로세스가 종료되고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

반응형