Như vậy:
if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {
...
Mặc dù tôi đã đọc man fcntl
, tôi không thể hiểu nó làm gì.
Như vậy:
if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {
...
Mặc dù tôi đã đọc man fcntl
, tôi không thể hiểu nó làm gì.
Câu trả lời:
Nó đặt cờ đóng-trên-thực thi cho bộ mô tả tệp, làm cho bộ mô tả tệp được đóng tự động (và nguyên tử) khi bất kỳ exec
hàm -family nào thành công.
Nó cũng kiểm tra giá trị trả về để xem liệu hoạt động có thất bại hay không, điều này khá vô ích nếu bộ mô tả tệp hợp lệ, vì không có điều kiện nào mà hoạt động này sẽ thất bại trên bộ mô tả tệp hợp lệ.
open
và không accept
, socket
, pipe
, vv ...
dup()
và dup2()
không bị ảnh hưởng, tất nhiên). Bạn có thể phải có các chức năng mới với tham số 'mode' hoặc 'flags' bổ sung, đó có lẽ là lý do tại sao nó không xảy ra. Nếu bạn có thể sử dụng O_CLOEXEC trên socket, thì bạn có thể giả sử rằng nó accept()
sẽ sao chép cờ đó trên bộ mô tả mà nó trả về. Nhưng socket()
và pipe()
phức tạp hơn.
dup
và dup2
bị ảnh hưởng. Cờ đóng trên thực thi áp dụng cho các bộ mô tả tệp, không áp dụng cho các mô tả tệp đang mở, do đó, nó không được chia sẻ trên các bộ mô tả tệp trùng lặp. Đó là một điều rất tốt.
dup3
, pipe2
, và accept4
. Ngoài ra, socket
có SOCK_CLOEXEC
cờ bạn có thể kết hợp với loại ổ cắm được yêu cầu.
Nó đánh dấu bộ mô tả tệp để nó sẽ được close()
d tự động khi tiến trình hoặc bất kỳ phần tử con nào mà nó fork()
gọi một trong các exec*()
họ hàm. Điều này rất hữu ích để tránh làm rò rỉ bộ mô tả tệp của bạn cho các chương trình ngẫu nhiên chạy bởi vd system()
.
FILE *
) được liên kết với trình mô tả tệp. Một cách sử dụng hợp lệ cho FD_CLOEXEC là đóng tệp nhật ký mà quy trình mẹ đã mở khi thực hiện quy trình shell. Lưu ý rằng POSIX 2008 có một tùy chọnopen(2)
cho O_CLOEXEC - vì vậy bạn có thể đặt thuộc tính này khi mở tệp, điều này sẽ rất hữu ích khi nó được phổ biến rộng rãi.