2012-08-06 6 views
10

다음 시나리오가 있습니다.쓰기 끝이 이미 닫혀있는 파이프의 읽기 끝을 명시 적으로 닫아야합니까?

  1. 파이프를 만듭니다.

  2. 하위 프로세스를 포크합니다.

  3. 아이가 파이프 명시 적으로의 끝을 읽고 아무것도 닫지 않고 파이프와 출구의 쓰기 마지막에 기록 닫힙니다 (아이를 대신하여 열려있는 모든 파일/배관 기술자를 닫아야 종료, 나는 가정).

  4. 부모는 파이프 명시 적으로의 쓰기 끝을 닫고 NULL fgetsfgets까지 수익률을 사용하여 파이프의 읽기 끝에서 읽습니다. ie 그것은 완전하게 읽는다.

내 질문은 왜 부모가 파이프 읽기 끝내기를 명시 적으로 닫아야합니까? 전체 데이터가 읽기 끝에서 읽혀지면 시스템에서 파이프를 모두 삭제하는 것이 현명하지 않습니까?

부모가 명시 적으로 읽기 끝을 닫고 더 이상 파이프를 여는 동안 Too many file descriptors 오류가 발생합니다. 필자의 가정은 쓰기 끝이 닫히고 데이터가 읽기 끝에서 완전히 읽혀지면 시스템이 파이프를 자동으로 삭제한다는 것입니다. 당신이 파이프에서 두 번 기울어 질 수 없기 때문에!

데이터가 완전히 읽혀지고 쓰기 종료가 끝나면 시스템 뒤의 논리가 그 파이프를 삭제하지 않는 이유는 무엇입니까?

+0

"파이프를 두 번 열지 마십시오."??? –

+0

@KerrekSB 내가 말한 것은 동일한 파이프를 두 번 읽을 수 있지만 두 번째로 EOF가 올바르게 표시된다는 것입니다. –

답변

7

아이가 끝나면 시스템이 파이프의 쓰기 끝을 닫는 것이 맞습니다. 그러나 자식이 fork이거나 다른 프로세스에 쓰기 끝의 복사본을 전달하는 경우 해당 파이프의 다른 쓰기 끝이 열려있을 수 있습니다.

파이프의 한쪽 끝에있는 모든 디스크립터가 (명시 적으로 또는 소유 프로세스가 종료 되었기 때문에) 닫힌 시점을 시스템이 알 수 있음은 여전히 ​​사실입니다. 부모 프로세스가 파이프 끝에있는 설명자를 닫으려고 할 때 혼란을 야기하므로 파이프의 다른 쪽 끝을 닫는 것이 여전히 의미가 없습니다.

  • fd가 시스템에 의해 닫혀 있습니다.이 경우 이미 닫힌 fd를 닫으려고 할 때 오류가 발생합니다. 또는
  • fd가 재사용되었습니다. 완전히 관련이없는 fd를 닫으므로 더 나쁩니다. 당신이 거기 비 효율성에 대해 걱정할 필요가 없습니다 시스템의 관점에서

, 그것은 물론, 한쪽 끝을 한 번에 모든 설명이 폐쇄 된 파이프를 폐기했을 수 있습니다. 더 중요한 것은 사용자 공간 프로세스가 일관된 경험을 가져야한다는 것입니다. 즉, 특별히 요구하지 않는 한 설명자를 닫지 않는 것을 의미합니다.

5

파일 디스크립터는 프로세스가 종료 될 때까지 시스템에 의해 닫히지 않습니다. 이것은 다른 파일 기술자뿐만 아니라 파이프에서도 마찬가지입니다.

데이터가없는 파이프 (또는 다른 파일)와 닫힌 파일 설명자간에 큰 차이가 있습니다.
파일 설명자가 닫히면 시스템은 새 파일 설명자를 위해 해당 번호를 재사용 할 수 있습니다. 그런 다음, 당신이 읽을 때, 당신은 다른 것을 얻습니다. 따라서 파일 설명자를 닫은 후에는 더 이상 사용하지 않아야합니다.

일단 더 이상 데이터가 없으면 시스템은 파일 설명자를 자동으로 닫는다고 상상해보십시오. 이것은 재사용을 위해 번호를 사용할 수있게 할 것이고, 그 이후 무관계 한 공개는 그것을 얻을 것이다. 이제 더 이상 데이터가 없다는 것을 모르는 독자는 파이프라고 생각하지만 실제로 다른 파일에서 읽을 것입니다.