(đóng góp bởi brian d Foy)
Không có một cách duy nhất để chạy mã trong nền để bạn không phải chờ đợi để nó kết thúc trước khi chương trình của bạn chuyển sang các tác vụ khác. Quy trình quản lý phụ thuộc vào hệ điều hành cụ thể của bạn, và nhiều kỹ thuật trong perlipc.
Một số module CPAN có thể giúp đỡ, trong đó có IPC::Open2 hoặc IPC::Open3, IPC::Run, Parallel::Jobs, Parallel::ForkManager, POE, Proc::Background, và Win32::Process. Có nhiều mô-đun khác bạn có thể sử dụng, vì vậy hãy kiểm tra các không gian tên đó để biết các tùy chọn khác.
Nếu bạn đang ở trên một hệ thống Unix-like, bạn có thể có thể nhận được ngay với một cuộc gọi hệ thống nơi bạn đặt một & vào phần cuối của lệnh:
system("cmd &")
Bạn cũng có thể thử sử dụng nĩa , như được mô tả trong perlfunc (mặc dù đây là điều tương tự mà nhiều mô-đun sẽ làm cho bạn).
STDIN, STDOUT, và stderr được chia sẻ
Cả hai quá trình chính và một background (những "đứa trẻ" quá trình) chia sẻ cùng một STDIN, STDOUT và stderr filehandles. 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ở trong perlfunc) nhưng trên một số hệ thống, điều này có nghĩa là tiến trình con không thể sống lâu hơn với cha mẹ. Tín hiệu Bạn sẽ phải nắm bắt tín hiệu SIGCHLD và có thể SIGPIPE. SIGCHLD được gửi khi quá trình nền kết thúc. SIGPIPE được gửi khi bạn viết cho một tập tin có quá trình con đã đóng (một SIGPIPE chưa được khai thác có thể khiến chương trình của bạn âm thầm chết). Đây không phải là vấn đề với hệ thống ("cmd &").
Zombies
Bạn phải chuẩn bị để "gặt hái" quá trình con khi nó kết thúc.
$SIG{CHLD} = sub { wait };
$SIG{CHLD} = 'IGNORE';
Bạn cũng có thể sử dụng một ngã ba đôi. Bạn ngay lập tức chờ() cho con đầu tiên của bạn, và daemon init sẽ chờ() cho cháu của bạn sau khi nó thoát.
unless ($pid = fork) {
unless (fork) {
exec "what you really wanna do";
die "exec failed!";
}
exit 0;
}
waitpid($pid, 0);
Xem các ký hiệu khác trong perlipc để biết các ví dụ khác về mã để thực hiện việc này. Zombies không phải là vấn đề với hệ thống ("prog &").
thử nghiệm ở đây dường như sorta làm việc cho tôi. Bạn đang cố gắng để thực hiện? – xenoterracide
là nó phải mở terminal và sau đó in hello world trong terminal? – xenoterracide
hoặc bạn chỉ đang cố thực hiện cuộc gọi không đồng bộ để mở thiết bị đầu cuối? – xenoterracide