Mô tả tập tin và ngã ba


14

Khi một đứa trẻ bị rẽ nhánh thì nó sẽ thừa hưởng các mô tả tập tin của cha mẹ, nếu đứa trẻ đóng bộ mô tả tập tin thì chuyện gì sẽ xảy ra? Nếu trẻ bắt đầu viết những gì sẽ xảy ra với tập tin ở cuối của cha mẹ? Ai quản lý những mâu thuẫn, kernel hoặc người dùng này?

khi một quá trình gọi closehàm để đóng một tệp đang mở cụ thể thông qua bộ mô tả tệp. Trong bảng tệp của quá trình, số tham chiếu được giảm đi bởi một. Nhưng vì cả cha và con đều giữ cùng một tệp, nên số tham chiếu là 2 và sau khi đóng nó giảm xuống còn 1. Vì nó không bằng 0 nên quá trình vẫn tiếp tục sử dụng tệp mà không gặp vấn đề gì.

Xem lập trình hệ thống Terrence Chan UNIX, (hỗ trợ hạt nhân Unix cho Tệp).


Được rồi, đừng bận tâm rằng chú thích cuối cùng;) Trong các trang người đàn ông cho open()fork()có sự phân biệt giữa một tập tin descript-hoặc và một tập tin descipt-ion - cựu đề cập đến sau này, và mặc dù mô tả trong một ngã ba là bản sao, họ đề cập đến cùng một mô tả. Tuy nhiên, khi được kiểm tra thì rõ ràng điều này không có nghĩa là đóng tay cầm của trẻ em đóng tay cầm của cha mẹ. Tôi nghĩ rằng nó có thể tạo ra một sự khác biệt tinh tế đối với việc xen kẽ dữ liệu khi cả hai xử lý ghi - nhưng dù sao thì điều đó là không xác định, vì vậy chính xác làm thế nào nó xảy ra không quá quan trọng.
goldilocks

Câu trả lời:


28

Khi một đứa trẻ bị rẽ nhánh thì nó sẽ thừa hưởng các mô tả tập tin của cha mẹ, nếu đứa trẻ đóng bộ mô tả tập tin thì chuyện gì sẽ xảy ra?

Nó kế thừa một bản sao của mô tả tập tin. Vì vậy, đóng mô tả ở trẻ sẽ đóng nó cho trẻ, nhưng không phải là cha mẹ, và ngược lại.

Nếu trẻ bắt đầu viết những gì sẽ xảy ra với tập tin ở cuối của cha mẹ? Ai quản lý những mâu thuẫn, kernel hoặc người dùng này?

Nó chính xác (như trong, chính xác theo nghĩa đen) giống như hai quá trình ghi vào cùng một tệp. Nhân lập lịch trình các quy trình một cách độc lập, do đó bạn có thể sẽ nhận được dữ liệu xen kẽ trong tệp.

Tuy nhiên, POSIX (mà hệ thống * nix phù hợp phần lớn hoặc hoàn toàn phù hợp), quy định rằng read()và các write()chức năng từ API C (ánh xạ tới các cuộc gọi hệ thống) là "nguyên tử đối với nhau [...] khi chúng hoạt động trên các tệp thông thường hoặc liên kết tượng trưng ". GNU C thủ công cũng tạm thời hứa hẹn điều này liên quan đến các đường ống (lưu ý mặc định PIPE_BUF, là một phần của proviso, là 64 kiB). Điều này có nghĩa là các cuộc gọi trong các ngôn ngữ / công cụ khác, chẳng hạn như sử dụng echohoặc cat, nên được bao gồm trong hợp đồng đó, vì vậy nếu hai quá trình độc lập cố gắng viết "xin chào" và "thế giới" đồng thời vào cùng một đường ống, thì điều gì sẽ xảy ra kết thúc là "hellowworld" hoặc "worldhello", và không bao giờ giống như "

Khi một quá trình gọi hàm đóng để đóng một tệp đang mở cụ thể thông qua bộ mô tả tệp. Bảng tệp của quá trình giảm số tham chiếu bởi một. Nhưng vì cả cha và con đều giữ cùng một tệp (có số lần điều chỉnh là 2 và sau khi đóng đến 1) vì nó không bằng 0 nên quá trình vẫn tiếp tục sử dụng tệp mà không gặp vấn đề gì.

Có HAI quá trình, cha mẹ và đứa trẻ. Không có "số tham chiếu" chung cho cả hai. Họ độc lập. WRT điều gì xảy ra khi một trong số họ đóng mô tả tệp, xem câu trả lời cho câu hỏi đầu tiên.


1

Bất cứ khi nào fork()tạo ra một đứa trẻ mới, các mô tả tập tin hoàn toàn không được giữ lại - chúng được thay đổi.

Mặc dù tệp sẽ là một bản sao, nhưng nó sẽ có một mô tả tệp khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.