2011-10-17 2 views
1

내 응용 프로그램에서 여러 자식 프로세스를 만들고 있습니다. fork() 후에 프로세스 파일 하나를 열고, 생성 된 프로세스의 stdout/stderr을 해당 파일을 가리 키도록 설정 한 다음 원하는 프로그램을 실행합니다.리눅스 - 자식 프로세스의 파일에 버퍼링 된 I/O 덤프

자식 프로세스가 printf를 수행 할 때 flush()를 호출 할 필요없이 즉시 출력 파일로 플러시되는 것과 같은 방식으로 부모 프로세스가 옵션을 설정할 수 있습니까? 또는 버퍼링 된 I/O를 비활성화하기 위해 자식 프로세스 자체 (exec 이전)에서 호출 할 수있는 API가 있습니까?

+0

setvbuf의 매뉴얼 페이지를 참조하십시오. stdout을 버퍼링하지 않도록 설정할 수 있습니다. stderr은 이미 버퍼링되지 않도록 설정되어 있습니다. –

답변

0

여기서 문제는 printf이 버퍼링된다는 것입니다. 기본 파일 디스크립터는 그런 식으로 버퍼되지 않지만 (커널에서 버퍼링되지만 다른 끝은 동일한 커널 버퍼에서 읽을 수 있음) 대답이었던 주석에 언급 된대로 setvbuf을 사용하여 버퍼링을 변경할 수 있습니다.

setvbuf(stdout, NULL, _IONBF, 0); 

당신은 stdin 또는 stderr이 작업을 수행 할 필요가 없습니다.

상위 프로세스에서 수행 할 수 없습니다. 이는 버퍼가 하위 프로세스에 의해 작성되기 때문입니다. 부모 프로세스는 stdout (C 라이브러리의 일부)이 아닌 기본 파일 설명자 (커널에 있음) 만 조작 할 수 있습니다.

P. 이 아니라 flush을 의미합니다.

+0

이 답변은 대부분 정확합니다. "커널에 버퍼 됨"을 제외하고. stdio 설비,'printf()'및'setvbuf()'는 libc에 버퍼링되어 있습니다. 커널에 버퍼링 된 파이프와 FIFO가 있지만 파일에 대한 리디렉션이 발생한다고 명시 적으로 언급합니다. 자식 프로세스가 수정 될 수 있다면, 표준 출력에서'setvbuf()'에 대한 호출은 자식 프로세스의 시작 부분에 추가되어야한다. (stderr는 기본적으로 버퍼되지 않습니다.) – Dummy00001

+0

@ Dummy00001 :'IO_DIRECT'와 같은 확장을 사용하지 않는 한, 모든 IO는 커널에 버퍼링됩니다.이 경우, 쓰기 전에 디스크에 의해 여전히 버퍼링됩니다. –

+0

setvbuf()가 exec를 통해 유지되지 않는 것처럼 보입니까? if (fork() == 0) {<임시 파일을 열고 stdout/err을이 파일로 리다> setvbuf() execf()} execf 코드의 printf 호출이 여전히 버퍼링되고 있습니다. – Manohar

관련 문제