programing tip

출력이 파일로 리디렉션 될 때 printf () 및 system ()의 결과가 잘못된 순서로 표시됨 [중복]

itbloger 2020. 8. 22. 08:16
반응형

출력이 파일로 리디렉션 될 때 printf () 및 system ()의 결과가 잘못된 순서로 표시됨 [중복]


myprogram이라는 실행 파일로 컴파일되는 C 프로그램이 있습니다. 이것이 주요 기능입니다.

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

  return 0;
}

myprogram > output.txtLinux 셸에서 실행 한 다음 output.txt를 검사하면 ls위에 나열된 "이것은 테스트 메시지입니다."라는 출력이 표시됩니다.

그 반대가되어야한다고 생각합니다. 이 문제가 발생하는 이유는 무엇이며 "이것은 테스트 메시지입니다"가 output.txt 상단에 표시되도록하려면 어떻게해야합니까?

중요한 경우 C와 명령 줄 작업을 처음 접합니다.


디폴트에 의해 출력은 stdout라인 버퍼 단자에 연결되었을 때. 즉, 버퍼가 가득 차거나 줄 바꿈을 추가하면 버퍼가 플러시됩니다.

그러나 , 경우는stdout파일로 프로그램의 출력을 리디렉션 할 때 무슨 일이 후, 일이 같은 터미널에 연결되어 있지stdout된다 완전 버퍼 . 즉, 버퍼가 가득 차거나 명시 적으로 플러시 될 때 (프로그램이 종료 될 때 발생) 실제로 버퍼가 플러시되고 기록됩니다.

즉, 코드에서 시작된 별도의 프로세스의 출력 (예 :을 호출 할 때 발생하는 작업 system)이 가장 먼저 작성 될 가능성이 큽니다. 해당 프로세스의 버퍼는 해당 프로세스가 종료 될 때 즉 자신의 프로세스 이전에 플러시되기 때문입니다.

리디렉션 (또는 해당 문제에 대한 파이프)을 사용하면 어떻게 되나요?

  1. 귀하의 printf호출은에 기록 stdout버퍼.
  2. system함수는 자체 버퍼에 쓰는 새 프로세스를 시작합니다.
  3. system호출로 시작된 외부 프로세스가 종료되면 해당 버퍼가 플러시되고 기록됩니다. 자신의 프로세스에있는 자신의 버퍼는 건드리지 않습니다.
  4. 자체 프로세스가 종료되고 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.

참고URL : https://stackoverflow.com/questions/52534629/results-of-printf-and-system-are-in-the-wrong-order-when-output-is-redirecte

반응형