Làm thế nào cùng một fd trong các quy trình khác nhau trỏ đến cùng một tệp?


25

Nói rằng tôi có quy trình 1quy trình 2 . Cả hai đều có một mô tả tập tin tương ứng với số nguyên 4.

Tuy nhiên, trong mỗi quy trình, bộ mô tả tệp 4 trỏ đến một tệp hoàn toàn khác nhau trong Bảng tệp mở của kernel:

nhập mô tả hình ảnh ở đây

Làm thế nào là có thể? Không phải là một mô tả tệp được coi là chỉ mục cho một bản ghi trong Bảng tệp mở?


1
Câu hỏi hay! Tôi đoán là các mô tả tập tin được dịch, do đó fd 4trong cả hai quá trình đều liên quan đến số lượng fd mở của chính nó. Fd 0-2(stdin, stdout, sdterr) luôn được mở cho một quy trình mới và các số không chỉ dành riêng cho quy trình đó.


@ jw013 Tôi nghĩ điều này nghe có vẻ quen thuộc. \ @Pithikos Làm thế nào đây không phải là một bản sao?
Michael Mrozek

1
Đây là một sơ đồ kém - nó sẽ chỉ ra rằng bộ mô tả tệp 4 có nghĩa là mục thứ tư [tốt, thứ năm, nó được tính từ 0] của bảng mô tả tệp ở bên trái, không phải là mục có chứa "4". "4" thực tế sống trong biến không gian người dùng của bạn có chứa số. Các sơ đồ trong câu hỏi khác là tốt hơn nhiều.
Random832

2
@ Random832 Vâng, nếu tôi biết sơ đồ nào là chính xác thì có lẽ tôi sẽ không bao giờ đưa ra câu hỏi này.
Pithikos

Câu trả lời:


35

Bộ mô tả tệp, tức là 4trong ví dụ của bạn, là chỉ mục vào bảng mô tả tệp cụ thể của quy trình , không phải bảng tệp mở. Bản thân mục mô tả tệp chứa một chỉ mục đến một mục trong bảng tệp mở toàn cầu của kernel, cũng như các cờ mô tả tệp.


2
Đối với bản ghi, chỉ có một "cờ mô tả tệp" trên hầu hết các hệ thống, đó là cờ close-on-exec. Tất cả các trạng thái "per-fd" khác (bao gồm phần bù và chế độ truy cập) là một phần của mục nhập bảng tệp mở.
Random832

24

Mỗi quá trình có bảng mô tả tập tin riêng của mình. Mô tả tệp 4 trong quy trình 1234 điểm trong bảng quy trình 1234. Mô tả tệp 4 trong quy trình 5678 điểm trong bảng quy trình 5678. Một trường hợp bạn phải làm quen là các mô tả tệp 0, 1 và 2, cho mỗi quy trình là đầu vào tiêu chuẩn, đầu ra tiêu chuẩn và lỗi tiêu chuẩn, chỉ ra bất cứ nơi nào chúng được chuyển hướng đến.

Một quá trình có thể mở cùng một tệp nhiều lần. Điều này có thể xảy ra ngẫu nhiên, ví dụ như khi đầu ra tiêu chuẩn và lỗi tiêu chuẩn của một quá trình được chuyển hướng đến cùng một thiết bị đầu cuối hoặc đến cùng một tệp. Các mục trong bảng tệp bên dưới (ví dụ: Linuxstruct file ) mang nhiều thông tin hơn về tệp; chúng cũng chứa các chế độ mở (ví dụ đọc hoặc ghi) và trạng thái khác (như cờ, ví dụ: close-on-exec). Ví dụ, một quy trình có thể có một thiết bị đầu cuối được mở để chỉ đọc trên bộ mô tả tệp 0 và cùng một thiết bị đầu cuối được mở để ghi chỉ trên bộ mô tả tệp 2. Các mục trong bảng tệp cũng chứa vị trí của quy trình trong tệp; một quá trình có thể muốn đến lseekhai vị trí khác nhau trong cùng một tệp và do đó sẽ sử dụng dupđể có được hai thẻ điều khiển cho tệp đó.


2
Điều này không hoàn toàn chính xác. Theo trang man / thông số kỹ thuật, dupthực hiện chính xác những gì nó nói trên hộp thiếc: cả hai mô tả kết quả đều trỏ đến cùng một mục nhập bảng tệp và do đó chia sẻ cùng một giá trị bù. Để có được 2 mục nhập bảng tệp khác nhau, tôi khá chắc chắn rằng bạn cần đến opentệp hai lần.
jw013

@Gilles "Mô tả tệp 4 trong quy trình 1234 điểm trong bảng quy trình 1234". Bạn muốn nói đến cái bàn nào Từ những gì tôi biết, bảng duy nhất trong quy trình là Bảng mô tả tệp trong đó mỗi bản ghi chỉ vào Bảng tệp mở duy nhất của kernel .
Pithikos



7

Sẽ không có thêm một mức độ gián tiếp khắc phục vấn đề của bạn? ("Tất cả các vấn đề trong lập trình máy tính có thể được giải quyết bằng một mức độ gián tiếp bổ sung" - một số greybeard khôn ngoan). Đó là, số nguyên nhỏ trong mỗi quy trình kết thúc dưới dạng một chỉ mục thành một mảng trên mỗi quy trình của các chỉ mục không gian nhân vào "Bảng tệp mở".


2
Các nguồn lọ khôn ngoan là khả năng David Wheeler. Có vẻ như anh ta cũng nói, " Nhưng điều đó thường sẽ tạo ra một vấn đề khác. " :)
jw013
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.