2010-09-28 29 views
12

Để so sánh với diff hồ sơ liền kề từ một tập tin, tôi đã tạo ra hai FIFOs, trẻ em chia hai để cung cấp ghi họ kết thúc, và bắt đầu ra củaTrong Perl, làm cách nào để tạo một FIFO tạm thời một cách an toàn?

diff -ub $previous $current 

nơi vô hướng chứa FIFOs đường dẫn hiện vật như thế nào bash process substitution công trinh.

Đây không phải là chương trình cần phải có bằng chứng chống đạn, nhưng nếu có, làm cách nào để tạo các FIFO tạm thời để tránh race conditions và các lỗ hổng khác? Hãy tưởng tượng File::Temp có một người anh em File::Temp::FIFO: điều gì sẽ là triển khai của người khác?

+0

Với quá trình thay bash, mỗi quá trình trong đường ống được hoàn tất trước khi 'diff' tức, 'diff <(ls $ first_directory) <(ls $ second_directory)' mỗi 'ls 'là hoàn thành trong tổng số trước khi' diff' được chạy trên kết quả đầu ra của họ. Bạn đang cố gắng thực hiện cùng một bản ghi bằng bản ghi ... – dawg

Trả lời

3

Giả sử tất cả các quá trình kết thúc được kết nối với FIFO bạn đã tạo, bạn có thể xóa chúng khỏi hệ thống tệp không? Các tập tin đã mở sẽ giữ FIFO khỏi bị xóa, nhưng không có tay cầm mới có thể được gắn vào nó, và một khi các tập tin hiện có được đóng lại, bản thân FIFO sẽ biến mất.

+0

Trên Unix, bạn nên ổn - Tôi không thể trả lời cho Windows. Các vấn đề khác tôi thấy là không 'mkfifo' theo liên kết không đầy đủ? Trên MacOS X, cả lệnh shell và cuộc gọi hệ thống đều thất bại với EEXISTS. Chọn tên ngẫu nhiên cho FIFO cũng sẽ giúp ích. –

+0

Câu hỏi của tôi tập trung vào việc tạo ra các FIFO, nhưng câu trả lời này dường như giả định chúng như đã cho. Tôi đang thiếu gì? –

+0

Vâng, bạn đã đề cập trong câu hỏi của bạn rằng "Tôi đã tạo ra hai FIFO"? Dù bằng cách nào, bạn có thể tạo chúng bằng các lệnh hệ thống 'mkfifo' hoặc' mknod'. – zigdon

6

Làm thế nào để tạo một thư mục tạm thời (a la mkdtemp()) để tránh điều kiện chủng tộc, và sau đó đặt FIFO của bạn trong đó?

Ví dụ:

use File::Temp qw(tempdir); 
use File::Spec::Functions qw(catfile); 
use POSIX qw(mkfifo); 

my $dir = tempdir(CLEANUP=>1); 
my $fifo0 = catfile($dir, "fifo0"); 
mkfifo($fifo0, 0700) or die "mkfifo($fifo0) failed: $!"; 
my $fifo1 = catfile($dir, "fifo1"); 
mkfifo($fifo1, 0700) or die "mkfifo($fifo1) failed: $!"; 

print "FIFO #0: $fifo0\n"; 
print "FIFO #1: $fifo1\n"; 
+0

Tại sao có hai thư mục? Cần ít nhất hai lần dọn dẹp. Một thư mục là đủ. –

+0

Hmmm .. Tôi đã quá thông minh vì lợi ích của chính mình. Bạn nói đúng, chỉ cần một thư mục tạm thời. –

+1

Đừng quên kiểm tra rằng 'tempdir' đã thành công. –

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