2010-11-24 4 views
13

Stevens의 UNIX 네트워크 프로그래밍에서 그는 데몬을 설정할 때 필요한 stdin, stdout 및 stderr의 경로 재 지정에 대해 언급합니다. 그는 다음과 같은 C 코드C에서 STDIN, STDOUT, STDERR을/dev/null로 재 지정

/* redirect stdin, stdout, and stderr to /dev/null */ 
open("/dev/null", O_RDONLY); 
open("/dev/null", O_RDWR); 
open("/dev/null", O_RDWR); 

나는이 세 가지가 * 세 가지 표준을 리디렉션하는 '알'이 얼마나 혼란 스러워요로 않습니다. 특히 마지막 두 명령이 같기 때문에 특히 그렇습니다. 누군가가 설명하거나 올바른 방향으로 나를 가리킬 수 있을까요?

+2

Tch. 이런 식으로하는 것은 위험합니다. 항상'dup2()'를 사용하십시오. –

+2

프로세스가 단일 스레드이고 이전 stdin/out/err을 이미 닫은 경우 위험하지 않습니다. –

+0

이 답변은 도움이 될 수 있습니다. http://stackoverflow.com/a/4973065/207753 – SlappyTheFish

답변

12

이 코드가 실행될 때 파일 설명자 0, 1 및 2가 이미 닫혀 있고 새 파일 설명자를 할당하는 다른 스레드가없는 것으로 보입니다. 이 경우 가장 낮은 사용 가능한 파일 설명자 번호를 항상 할당하려면 open이 필요하기 때문에 open에 대한 세 번의 호출은 실패하지 않는 한 파일 설명자 0, 1 및 2를 생성합니다.

+0

그가 'O_WRONLY'대신에'O_RDWR'을 선택한 이유는 무엇입니까? –

+0

파일 설명자의 순서가 stdin, stdout, stderr이므로. 물론 표준 입력은 읽기 전용입니다. – slezica

+0

확실히 stdout과 stderr는'O_WRONLY'로 열릴 수 있었지만, 정말로 중요하지 않다고 생각합니다. –

3

파일 설명자 0, 1 및 2는 각각 입력, 출력 및 오류이므로 open은 사용 가능한 첫 번째 파일 설명자를 가져옵니다. 파일 설명자 0, 1 및 2가 아직 사용되지 않은 경우에만 작동합니다.

그리고 그와 파일 디스크립터 사이에 상관 관계가 있지만 당신은 사실이 아니라 파일 기술자에 비해 핸들 (FILE*)를 제출하는 사용되는 용어, stdin, stdoutstderr에 대해주의해야합니다.