Tôi vừa theo dõi một vấn đề mà tôi phải đóng tất cả các tập tin mở cho tập lệnh Apache cgi của mình để tiếp tục. Tôi đã theo dõi vấn đề với Parse :: RecDescent.Cách tìm tập tin mở toàn cầu trong một chương trình perl
#!/usr/bin/env perl
use strict;
use warnings;
use feature qw/say/;
$|++;
print "Content-Type: text/plain\n\n";
use Parse::RecDescent;
say "$$: pre-fork: ". time;
if(my $pid = fork) {
# parent
say "$$: return immediately: ". time;
}
else {
# child
say "$$: kicked off big process: ". time;
close STDIN;
close STDOUT;
close STDERR;
# close *{'Parse::RecDescent::ERROR'};
sleep 5;
}
Câu hỏi của tôi là làm cách nào để tìm tất cả các tệp mở gói?
Tôi biết fileno
sẽ trả lại bộ đếm cho một tệp mở. Có cách nào để thực hiện tra cứu ngược lại các mục này hoặc đóng các tập tin bằng bộ đếm fileno
không?
Tôi thích sự đơn giản này. – CoffeeMonster
@ikegami: Giới thiệu về cờ close-on-exec: Perl's 'open()' sẽ sử dụng giá trị '$^F' để xác định xem các tệp mới được mở có được đặt cờ đóng-on-exec hay không. '$^F' đại diện cho giá trị stdin, stdout, stderr" cutoff "- các bộ mô tả tập tin ở trên' $^F' nhận được bộ bit close-on-exec _at thời gian của 'open()' _. (Không phải 'exec()' thời gian.) Vì stdin, stdout và stderr được mở _before_ thực thi của tập lệnh, '$^F' sẽ không ảnh hưởng nếu chúng được đóng trong' exec() '. (Ngẫu nhiên, tôi đọc điều này có nghĩa là chỉ đóng 'STDIN',' STDOUT' và 'STDERR' là' $^F = 2' theo mặc định.) – sarnold
@sarnold, Tuyệt vời khi nói về $^F. Đó là chút tôi đã mất tích. Bạn sẽ nghĩ rằng tôi muốn biết thêm về điều này kể từ khi tôi đã viết mã trong IPC :: Open3 mà đặt close-on-exec trên một xử lý! – ikegami