2012-08-06 25 views
10

Tôi có kịch bản sau đây.Chúng ta có cần đóng đầu đọc của một đường ống rõ ràng có đầu ghi đã đóng không?

  1. Tôi tạo đường ống.

  2. Chia nhỏ quy trình con.

  3. trẻ em đóng vai trò quant đọc cuối của ống rõ ràng và ghi vào ghi cuối của ống và lối thoát hiểm mà không đóng bất cứ điều gì (exit nên đóng tất cả các file descriptor/ống mở trên danh nghĩa của đứa trẻ, tôi đoán).

  4. Cha mẹ đóng đầu ghi của ống rõ ràng và đọc từ đầu đọc của đường ống sử dụng fgets trả về NULL. tức là nó đọc hoàn toàn.

Bây giờ câu hỏi của tôi là, tại sao phụ huynh cần phải đóng đầu đọc của ống một cách rõ ràng khi đọc xong? Không phải là nó khôn ngoan cho hệ thống để xóa các đường ống hoàn toàn khi dữ liệu hoàn chỉnh đã được đọc từ đầu đọc?

Tôi dint đóng đầu đọc một cách rõ ràng trong bố mẹ và tôi có lỗi Too many file descriptors sớm hay muộn trong khi mở nhiều đường ống hơn. Giả thiết của tôi là hệ thống sẽ tự động xóa một đường ống khi kết thúc ghi của nó bị đóng và dữ liệu đã được đọc hoàn toàn từ đầu đọc. Cos bạn không thể từ một đường ống hai lần!

Vì vậy, lý do cơ bản đằng sau hệ thống không xóa đường ống khi dữ liệu đã được đọc hoàn toàn và ghi kết thúc là gì?

+0

"Bạn không thể từ một đường ống hai lần!" ??? –

+0

@KerrekSB Những gì tôi có nghĩa là bạn có thể đọc cùng một đường ống hai lần nhưng sẽ thấy EOF lần thứ hai phải không? –

Trả lời

7

Bạn đúng là hệ thống sẽ đóng đầu ghi của ống sau khi trẻ thoát. Tuy nhiên có thể có một đầu ghi khác của đường ống đó, nếu con fork s hoặc chuyển một bản sao của đầu ghi vào một tiến trình khác.

Nó vẫn đúng là hệ thống sẽ có thể biết khi tất cả các mô tả ở một đầu của một đường ống đã được đóng lại (hoặc rõ ràng hoặc vì quá trình sở hữu đã thoát). Nó vẫn không có ý nghĩa để đóng những người ở đầu kia của đường ống, vì điều đó sẽ dẫn đến sự nhầm lẫn khi quá trình cha mẹ cố gắng đóng bộ mô tả trên đầu ống; hoặc:

  • fd đã bị hệ thống đóng, trong trường hợp đó có lỗi khi cố gắng đóng một fd đã đóng; hoặc
  • fd đã được sử dụng lại, thậm chí còn tồi tệ hơn vì hiện tại nó đang đóng một fd hoàn toàn không liên quan.

Từ quan điểm của hệ thống, nó có thể đã loại bỏ đường ống khi tất cả các mô tả ở một đầu đã bị đóng, vì vậy bạn không cần phải lo lắng về sự kém hiệu quả ở đó. Điều quan trọng hơn là quy trình không gian người dùng phải có trải nghiệm nhất quán, có nghĩa là không đóng bộ mô tả trừ khi được yêu cầu cụ thể.

5

Trình mô tả tệp không bị hệ thống đóng, cho đến khi quá trình thoát. Điều này đúng với đường ống, cũng như bất kỳ bộ mô tả tập tin nào khác.

Có sự khác biệt lớn giữa một đường ống (hoặc bất kỳ tệp nào khác) không có dữ liệu trong đó và mô tả tệp đã đóng.
Khi bộ mô tả tệp bị đóng, hệ thống có thể sử dụng lại số của nó để có bộ mô tả tệp mới. Sau đó, khi bạn đọc, bạn sẽ có được một cái gì đó khác. Vì vậy, sau khi bạn đóng một bộ mô tả tập tin, bạn không còn sử dụng nó nữa.

Bây giờ hãy tưởng tượng rằng khi không còn dữ liệu nữa, hệ thống sẽ tự động đóng bộ mô tả tệp. Điều này sẽ làm cho số có sẵn để tái sử dụng, và một mở không liên quan tiếp theo có thể nhận được nó. Bây giờ người đọc, người chưa biết rằng không có thêm dữ liệu, sẽ đọc từ những gì nó nghĩ là đường ống, nhưng thực sự sẽ đọc từ một tập tin khác.

Các vấn đề liên quan