Tôi đang viết một chương trình hỗ trợ nhiều quy trình con và tôi muốn tất cả các quy trình con này có thể viết dòng STDERR
và STDOUT
mà không cần đầu ra bị cắt xén. Tôi không làm bất cứ điều gì ưa thích, chỉ phát ra các dòng kết thúc bằng một dòng mới (điều đó, ít nhất trong sự hiểu biết của tôi sẽ là một hoạt động nguyên tử cho Linux). Từ perlfaq nó nói:fork() và STDOUT/STDERR vào giao diện điều khiển từ các tiến trình con
Cả quy trình chính và nền được xử lý (quy trình "con") đều có cùng tệp STDIN, STDOUT và STDERR. Nếu cả hai cố gắng truy cập chúng cùng một lúc, những điều kỳ lạ có thể xảy ra. Bạn có thể muốn đóng hoặc mở lại những thứ này cho đứa trẻ. Bạn có thể giải quyết vấn đề này bằng cách mở một đường ống (xem mở) nhưng trên một số hệ thống, điều này có nghĩa là quá trình con không thể sống lâu hơn với cha mẹ.
Điều đó nói rằng tôi nên "đóng hoặc mở lại" các tệp này cho trẻ. Kết thúc rất đơn giản, nhưng "reopen" có nghĩa là gì? Tôi đã thử một cái gì đó như thế này từ trong quá trình con tôi và nó không hoạt động (đầu ra vẫn bị cắt xén):
open(SAVED_STDERR, '>&', \*STDERR) or die "Could not create copy of STDERR: $!";
close(STDERR);
# re-open STDERR
open(STDERR, '>&SAVED_STDERR') or die "Could not re-open STDERR: $!";
Vì vậy, tôi đang làm gì với điều này? Ví dụ về đường ống sẽ ám chỉ như thế nào? Có cách nào tốt hơn để phối hợp đầu ra từ nhiều quy trình với nhau để bàn điều khiển?
Tôi đã kết thúc với IO :: Pipe và AnyEvent cho các đường ống và lựa chọn IO, nhưng điều đó dường như hoạt động. Cảm ơn – mpeters