2011-08-19 5 views
3

필자는 유닉스에 합리적으로 익숙해 져 있고 오랜 시간 동안 프로그래밍했지만 필자는 파일 조작에 익숙하지 않습니다.UNIX 파일 설명자 재사용

0/1/2 파일 디스크립터는 표준 입력, 출력 및 오류라는 것을 알고 있습니다. 나는 프로세스가 파일을 열 때마다, 아직 사용되지 않은 가장 작은 값을 가진 디스크립터가 주어진다는 것을 알고있다. 그리고 나는 dup/dup2를 사용하는 것에 대해 이해한다.

프로세스간에 파일 설명자를 혼동합니다. 각 프로세스는 in/out/error에 대해 자체 0/1/2 디스크립터를 갖거나 모든 프로세스간에 공유되는 3 개의 디스크립터입니까? 3 개의 다른 쉘에서 3 개의 프로그램을 실행하는 방법은 무엇입니까?

두 프로그램이 시작 후 myfile.txt를 열면 둘 다 파일 설명자 # 3을 사용합니까, 아니면 두 번째 프로그램이 3 번을 사용한 후 # 4를 사용합니까?

저는 몇 가지 방법으로 같은 질문을했지만 저는 분명히하고 싶었습니다. 자세한 내용은 더 나은 :) 나는 프로그래밍하는 동안 이런 일들에 문제가 생겨본 적이 없지만 더 많은 것을 이해하기 위해 유닉스 책을 읽고있다. 그리고 나는 갑자기 이런 혼란을 많이 깨달았다. 전에 자세히.

+0

게시글에 'c'언어 태그를 추가하면 더 좋은 의견을 얻을 수 있습니다. 나는 이것이 여러 번 논의 된 것을 보았으므로 '[c] stdout dup descriptors'를 검색하십시오. 행운을 빕니다. – shellter

+0

감사합니다. 태그를 추가했습니다. 다른 질문도 보겠습니다. –

답변

5

각 파일 설명자는 프로세스에 국한됩니다. 그러나 일부 파일 디스크립터는 동일한 파일을 참조 할 수 있습니다. 예를 들어 fork()을 사용하여 하위 프로세스를 생성하면 부모가 여는 파일을 공유하게됩니다. 처음에는 상위 파일과 동일한 파일 설명자를 가지지 만 닫는/이중 복사 등으로 바뀔 수 있습니다.

두 파일이 동일한 파일을 열 경우 일반적으로 파일 설명자를 별도로 가져옵니다. 별도의 내부 구조를 가리키고있다. 그러나 특정 기술 (fork, FD 전달 등)을 사용하면 서로 다른 프로세스의 파일 설명자가 동일한 내부 엔터티를 가리킬 수 있습니다. 일반적으로, 그것은 사실이 아닙니다.

질문에 답해 주면 두 프로그램 모두 새로 열린 파일에 대해 FD # 3을 사용하게됩니다.

3

UNIX (일반적으로)의 파일 설명자는 fork() 및 exec() 호출을 통해 지속됩니다. 그래서 네, 여러 프로세스가 파일 설명자를 공유 할 수 있습니다. 이 경우

foo | bar 

, foo는의 표준 출력이 바의 표준 입력에 연결되어 있어야합니다 :

예를 들어, 쉘은 명령과 같이 할 수 있습니다. 이를 위해 쉘은 pipe()를 사용하여 reader 및 writer 파일 설명자를 생성합니다. 그것은 fork()를 두 번합니다. 설명자는 계속 유지됩니다. foo를 호출 할 fork()가 닫힙니다 (1); dup (writer_fd); writer_fd descriptor 1을 만든다. 그러면 exec()가 처리되고, foo가 우리가 생성 한 파이프로 출력 할 것이다. 막대의 경우 닫기 (0); dup (독자); then exec(). 그리고 voila, foo는 bar로 출력 할 것입니다.

+2

프로세스가 설명자를 공유하지 않습니다.그러나 (동일한 프로세스 또는 다른 프로세스에서) 여러 파일 설명자는 현재 위치, 비 블로킹 플래그 등과 같은 속성을 공유하는 동일한 "열린 파일 설명"을 참조 할 수 있습니다. –

3

파일 설명자가 나타내는 리소스와 파일 설명자를 혼동하지 마십시오. 10 개의 서로 다른 프로세스를 가질 수 있으며, 각 프로세스는 '3'의 파일 디스크립터를 열고 각각은 서로 다른 열린 파일을 참조합니다. 프로세스가 파일 디스크립터를 사용하여 I/O를 수행하면 OS는 어느 프로세스가 I/O를 수행하고 있는지 알고 어떤 파일이 참조되는지 명확히 할 수 있습니다.

관련 문제