2016-12-02 1 views
0

나는 c에서 linux 데몬을 만들려고하는데 어떤 사람이 sample code on this page 인 것을 발견했다.STDIN/OUT/ERR 리디렉션

나는 STDIN, STDOUT 및 STDERR (/ dev/null /로)을 리디렉션하려는 경우를 제외하고 모든 코드를 이해합니다. 나는 또한 여기에 이러한 리디렉션해야 관련이 질문을 발견 (내가 이해).

는 특히 내 질문에 관련 코드의 섹션은 다음과 같습니다

/* Route I/O connections */ 

/* Open STDIN */ 
i = open("/dev/null", O_RDWR); 

/* STDOUT */ 
dup(i); 

/* STDERR */ 
dup(i); 

dup() 단순히 파일 기술자를 복제하는 것이 함축 man page for dup() 읽기.

그래서 어떻게 리디렉션을하는지 이해할 수 없습니까? 컴파일러가 위의 줄에있는 주석에서 힌트를 얻고 있습니까? 아니면 일부 코드가 누락 되었습니까?, 잘못 되었습니까? 아니면 뭔가 빠졌습니까? DUP의 사람 페이지에서

+2

대해 그 일례를 가장 낮은 번호 않는 기술자 되었습니까 사용 파일 디스크립터 newfd를 사본을 작성 새 STDIN, STDOUT 및 STDERR을 작성하기 전에 닫으십시오. 그래서 사용 가능한 다음 free fd는 0, 1, 2가됩니다. – infixed

+1

[C에서/dev/null로 STDIN, STDOUT, STDERR을 리디렉션 할 수 있습니다] (http://stackoverflow.com/questions/4263173/redirecting -stdin-stdout-stderr-dev-null-in-c) –

답변

1

그것의 수입은 링크 예제 코드의 이전 비트를 이해합니다.open() 상태

성공적인 호출에 의해 반환되는 파일 기술자에 대한 맨 페이지로

프로세스 그래서

에 대한 가장 낮은 번호의 파일 기술자 현재 열려 있지 않은 것 open()에 대한 후속 호출 예제 코드에서는 STDIN 인 파일 설명 자 0/dev/null으로 리디렉션합니다.

이어서 dup()을 호출하면 다음으로 낮은 숫자를 사용하여 파일 설명자가 복제됩니다. STDOUT1이고, STDERR2이다.

dup() 상태의 맨 :

dup() 시스템 호출은 새로운 디스크립터

1

:

DUP는 (newfd를) 시스템 호출은 새로운 기술자되지 않는 가장 작은 디스크립터 번호를 사용하여 파일 기술자 newfd를, 의 복사본을 만듭니다.

참조 된 코드를 볼 경우, 그가 처음 닫는 열려있는 모든 파일 설명 : 당신이 dup(i)를 호출 할 때, 그것은 가장 낮은 기술자에 파일 기술자 난을 복사합니다 후

 for (i = getdtablesize(); i >= 0; --i) 
     { 
      close(i); 
     } 

, 0 (stdin)이됩니다. 이 작업을 다시 수행하면 설명자 1 (stdout)으로, 설명자 2 (stderr)와 마찬가지로 복사됩니다. 이러한 방식으로, 디먼 프로세스의 stdin, stdoutstderr/dev/null을 가리 킵니다.

모든 프로세스는 stdin, stdoutstderr (일반적으로이 설명자의 값은 각각 0, 1 및 2 임)의 세 가지 열린 파일 설명자를 얻습니다. 예를 들어, printf()을 호출하면 stdout 설명자가 가리키는 파일에 씁니다. 이 설명자를 다른 파일 (예 : /dev/null)로 지정하면이 프로세스의 모든 출력이 해당 파일로 리디렉션됩니다. 동일한 로직이 stdinstderr에 적용됩니다.

ls > ls.out과 같은 것을 실행할 때 셸에서는 쉘이 동일하게 작동합니다. 새로운 프로세스 인 fork()은 쓰기를 위해 ls.out을 열고, ls.out의 파일 설명자를이 프로세스의 stdout으로 복사하기 위해 dup (또는 dup2)을 호출합니다. 이 STDIN, STDOUTSTDERR을 포함한 모든 파일 기술자를 닫

/* close all descriptors */ 
     for (i = getdtablesize(); i >= 0; --i) 
     { 
      close(i); 
     } 

: