dup2를 사용하여 stdout / stderr을 리디렉션 한 다음 나중에 resinstate

존 U

배경 : Busybox (제한된 리소스)를 실행하는 임베디드 리눅스 시스템이 있고, 일반적으로 콘솔에 많은 정보를 뱉어내는 프로세스가 실행되고 있지만 (stdout / stderr를 통해) 일시적 으로 syslog로 리디렉션 하고 싶습니다 (syslogd 사용). / logger) on command-프로세스를 다시 시작하거나 재부팅하지 않고.

여기에 있는 코드를 사용하면 stdout / stderr에 대한 쓰기가 실패하고 모든 것이 중단되는 지점에서 로거 fd를 중지 / 닫으려고 할 때까지 잘 작동합니다. 아래 예 :

int main()
{

    // Got command to direct all output to syslog:

    FILE *fl;
    fl = popen("logger","w");
    if(fl == NULL)
        return 1;
    fprintf(fl,"logger test new"); // This goes to syslogd
    int nf;
    nf = fileno(fl);
    dup2(nf,STDOUT_FILENO);
    dup2(nf,STDERR_FILENO);
    fprintf(stdout,"Written in stdout\n");
    fprintf(stderr,"Written in stderr\n");

    // ...some time later when we've logged enough things:

    pclose(fl);
    fprintf(stdout,"This will fail\n");
    fprintf(stderr,"Catch fire and die\n");
}

따라서 문제는 로깅이 끝나면 원래 상태를 (어떻게) 복원 할 수 있습니까?

에 RTFM을 갖는 dup()하고 dup2()나는 그것이 아마도 "다시"를 가능하다면 우리가 이것을 달성 할 수있는 방법을 정확하게에 취소 아니에요 freopen()표준 출력 / 표준 오류,하지만 마지막 수단으로는 아마 점에 허용 될 수 nf/dev/null/적어도 일들이 충돌하지를 할 수 있도록 .

스펙트럼

dup2 전에 초기 파일 설명자를 복제해야합니다. 그렇지 않으면 dup2가이를 닫고이를 복구 할 방법이 없습니다.

int stdout_copy = dup(STDOUT_FILENO);
dup2(nf, STDOUT_FILENO);

/* do something with stdout */

dup2(stdout_copy, STDOUT_FILENO);
close(stdout_copy);

오류 처리를 fflush하고 stdlib 버퍼에 데이터를 쓰지 않은 상태로 두지 않도록 호출을 추가하십시오 .

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

stdout과 stderr을 함께 리디렉션 VS stdout을 리디렉션 한 다음 stderr을 stdout의 파일로 리디렉션

분류에서Dev

/ bin / sh를 사용하여 stderr 및 stdout을 / dev / null로 리디렉션합니다.

분류에서Dev

변수를 사용한 Stdout 및 Stderr 리디렉션

분류에서Dev

stderr을 stdout으로 리디렉션 한 다음 파이프 (apt-cache)하는 방법

분류에서Dev

공유 stderr 리디렉션을 사용한 다중 세션 병렬 처리

분류에서Dev

dup 없이도 동일한 결과를 얻을 수 있는데 stdout 리디렉션에 dup을 사용해야하는 이유는 무엇입니까?

분류에서Dev

bash stdout + stderr를 한 파일로, stderr를 다른 파일로 리디렉션

분류에서Dev

netcat없이 dup2를 사용하여 소켓을 통해 클라이언트에서 서버로 셸 리디렉션

분류에서Dev

시스템 명령을 사용하여 stdout 및 stderr 출력을 파일로 리디렉션하는 것이 Perl에서 작동하지 않습니다.

분류에서Dev

bash 명령을 실행하고 stdout / stderr를 각각 50K로 제한되는 다른 파일로 리디렉션합니다.

분류에서Dev

stderr를 파일로 리디렉션하고 일부 에코 (stdout 아님)를 동일한 파일로 리디렉션하는 방법

분류에서Dev

stderr 및 stdout을 동일한 파일로 리디렉션하는 방법

분류에서Dev

종료 코드를 변경하지 않고 stdout 및 stderr을 다른 프로그램으로 리디렉션

분류에서Dev

nc에 대한 STDOUT 및 STDERR 리디렉션

분류에서Dev

nc에 대한 STDOUT 및 STDERR 리디렉션

분류에서Dev

Python의 하위 프로세스 / Popen에서 stdout을 stderr로 리디렉션

분류에서Dev

stdout과 stderr를 모두 파일로 리디렉션 할 때 stderr에서 stdout으로 리디렉션해야하는 이유는 무엇입니까?

분류에서Dev

공유 파일 및 dup2 ()를 사용하여 명령의 stdout을 다른 명령의 stdin으로 파이프

분류에서Dev

stdout 및 stderr을 리디렉션하면 여전히 stdout으로 인쇄됩니다.

분류에서Dev

실행 중에 stderr을 stdout으로 리디렉션

분류에서Dev

stdout 및 stderr를 다른 파일로 리디렉션

분류에서Dev

while read 행을 사용하여 한 파일의 내용을 다른 파일로 리디렉션하는 경우에만 숫자 "2"를 표시합니다.

분류에서Dev

stdout을 파일로 리디렉션하고 stdout + stderr을 다른 파일로 리디렉션하는 방법은 무엇입니까?

분류에서Dev

먼저 리디렉션 한 다음 .htaccess를 사용하여 대체

분류에서Dev

stdout 및 stderr을 파일에 저장 한 다음 나중에 출력을 다시 만듭니다.

분류에서Dev

헤더와 대안을 사용한 다중 리디렉션

분류에서Dev

bash : stderr를 파일로 리디렉션하고 stdout + stderr를 화면으로 리디렉션

분류에서Dev

DotNetOpenAuth를 사용한 다중 리디렉션 URL

분류에서Dev

nohup : stderr을 우분투에서 stdout으로 리디렉션

Related 관련 기사

  1. 1

    stdout과 stderr을 함께 리디렉션 VS stdout을 리디렉션 한 다음 stderr을 stdout의 파일로 리디렉션

  2. 2

    / bin / sh를 사용하여 stderr 및 stdout을 / dev / null로 리디렉션합니다.

  3. 3

    변수를 사용한 Stdout 및 Stderr 리디렉션

  4. 4

    stderr을 stdout으로 리디렉션 한 다음 파이프 (apt-cache)하는 방법

  5. 5

    공유 stderr 리디렉션을 사용한 다중 세션 병렬 처리

  6. 6

    dup 없이도 동일한 결과를 얻을 수 있는데 stdout 리디렉션에 dup을 사용해야하는 이유는 무엇입니까?

  7. 7

    bash stdout + stderr를 한 파일로, stderr를 다른 파일로 리디렉션

  8. 8

    netcat없이 dup2를 사용하여 소켓을 통해 클라이언트에서 서버로 셸 리디렉션

  9. 9

    시스템 명령을 사용하여 stdout 및 stderr 출력을 파일로 리디렉션하는 것이 Perl에서 작동하지 않습니다.

  10. 10

    bash 명령을 실행하고 stdout / stderr를 각각 50K로 제한되는 다른 파일로 리디렉션합니다.

  11. 11

    stderr를 파일로 리디렉션하고 일부 에코 (stdout 아님)를 동일한 파일로 리디렉션하는 방법

  12. 12

    stderr 및 stdout을 동일한 파일로 리디렉션하는 방법

  13. 13

    종료 코드를 변경하지 않고 stdout 및 stderr을 다른 프로그램으로 리디렉션

  14. 14

    nc에 대한 STDOUT 및 STDERR 리디렉션

  15. 15

    nc에 대한 STDOUT 및 STDERR 리디렉션

  16. 16

    Python의 하위 프로세스 / Popen에서 stdout을 stderr로 리디렉션

  17. 17

    stdout과 stderr를 모두 파일로 리디렉션 할 때 stderr에서 stdout으로 리디렉션해야하는 이유는 무엇입니까?

  18. 18

    공유 파일 및 dup2 ()를 사용하여 명령의 stdout을 다른 명령의 stdin으로 파이프

  19. 19

    stdout 및 stderr을 리디렉션하면 여전히 stdout으로 인쇄됩니다.

  20. 20

    실행 중에 stderr을 stdout으로 리디렉션

  21. 21

    stdout 및 stderr를 다른 파일로 리디렉션

  22. 22

    while read 행을 사용하여 한 파일의 내용을 다른 파일로 리디렉션하는 경우에만 숫자 "2"를 표시합니다.

  23. 23

    stdout을 파일로 리디렉션하고 stdout + stderr을 다른 파일로 리디렉션하는 방법은 무엇입니까?

  24. 24

    먼저 리디렉션 한 다음 .htaccess를 사용하여 대체

  25. 25

    stdout 및 stderr을 파일에 저장 한 다음 나중에 출력을 다시 만듭니다.

  26. 26

    헤더와 대안을 사용한 다중 리디렉션

  27. 27

    bash : stderr를 파일로 리디렉션하고 stdout + stderr를 화면으로 리디렉션

  28. 28

    DotNetOpenAuth를 사용한 다중 리디렉션 URL

  29. 29

    nohup : stderr을 우분투에서 stdout으로 리디렉션

뜨겁다태그

보관