표준 출력을 파일로 보내는 것이 일관성이 없고 지연되는 이유는 무엇입니까? [복사]

표준 출력을 파일로 보내는 것이 일관성이 없고 지연되는 이유는 무엇입니까? [복사]

나는 프로그램 호출의 출력을 printf파일로 보내는 두 가지 방법을 시도했습니다. 두 경우 모두 파일이 즉시 업데이트되는 경우도 있고, 몇 분 정도 걸리거나, 파일이 전혀 업데이트되지 않는 경우도 있습니다.

내 프로그램은 다음이 만든 bash 스크립트에서 실행됩니다./etc/network/if-up.d/upstart. 내 bash 스크립트에 대해 이것을 시도했습니다.

    #!/bin/bash
    sleep 2

    if ! pgrep "demo" > /dev/null
    then
        sudo /home/pi/code/demo_device/demo >> /home/pi/code/demo_device/auto_log.txt 2>&1 &
    fi

이:

    #!/bin/bash
    exec 1> >(logger -s -t $(basename $0)) 2>&1
    sleep 2

    if ! pgrep "demo" > /dev/null
    then
        sudo /home/pi/code/demo_device/demo &
    fi

이것자동 log.txt첫 번째 경우의 파일과/var/log/user.log 파일두 번째 경우에는 둘 다 위에서 설명한 문제를 겪습니다. 또한 bash 스크립트를 실행하게 했습니다.데모실행 파일을 실행해도 start-stop-daemon동일한 결과가 나타납니다. 시작 시 백그라운드 프로세스로 프로그램을 실행할 때 로그 파일을 즉시 일관되게 업데이트하려면 어떻게 해야 합니까?

참고: 이것이 관련이 있는지는 모르겠지만 프로그램은 계속 실행되고 절대 종료되지 않도록 설계되었습니다.

답변1

출력 파일이 업데이트되지 않는 경우 C 프로그램을 수정하여 문 fflush(stdout);뒤에 문을 추가해 보세요 printf(). 이렇게 하면 출력 스트림에 강제로 기록됩니다. 일반적으로 printf()에 하나가 있으면 \n출력이 화면이나 파일에 기록되지만 항상 그런 것은 아닙니다. 따라서 정말로 그런 일이 일어나길 원할 때, fflush(); 모든 printf 문 다음에 fflush()를 사용하고 사용할 필요가 없다면, 그냥 가장 의미 있는 곳에 두십시오. 그러면 그 시점에서 이전의 모든 printf 문이 필요할 수 있습니다. 버퍼에 기록됩니다.

C 프로그램이 stdout이 아닌 다른 파일 핸들에 쓰는 경우 다음 샘플 프로그램에 표시된 대로 파일 포인터를 fflush()에 배치합니다.

#include <stdio.h>

int main ( int argc, char *argv[] )
{
    FILE *fp;

    fp = fopen( "test.txt", "w" );
    if ( fp != NULL )
    {
       fprintf( fp, "hello world\n");
       fflush( fp );

       /* 
          100+ lines of code here doing something else,
          which could cause the above printf to sit in the
          buffer until fclose or the program ends
       */

       fclose( fp );
    }
    return 0;
}

출력을 작성하는 C 프로그램을 수정할 수 없다면 프로그램 외부에서 버퍼를 강제로 플러시하는 방법을 모르겠습니다.

관련 정보