2009-09-04 19 views
5

我想調用其他Perl腳本來執行主Perl腳本的爭用測試。如何使用Perl的系統調用來產生獨立的線程?

事情是這樣的當前工作:

system("perl 1.pl"); 
system("perl 2.pl"); 
exit; 

不過,我想踢這些關在同一時間運行的獨立線程。

我試過了,根據我的谷歌搜索,做這樣的事情:

system(1, "perl 1.pl"); 
system(1, "perl 2.pl"); 
exit; 

這是行不通的。主腳本立即存在,這很好,但我想產生的底層線程不會被啓動。我想知道是否還有其他事情需要我去做,或者有沒有其他人做過這樣的事情。

感謝您提前提供任何幫助。

+1

你想線程或進程? Perl的'system()'函數正在創建一個子進程(並且在執行下一個Perl語句之前等待其完成)。這些對'system(1,...)'的調用看起來不像有意義的東西(fork(),然後execve()一些被稱爲「1」的程序,其參數爲「perl ...」) 如果你想要子過程,從這個問題中刪除「threads」標記 – 2009-09-04 18:04:33

回答

13
use threads; 
$thr1 = threads->create('msc', 'perl 1.pl'); 
$thr2 = threads->create('msc', 'perl 2.pl'); 

$thr1->join(); 
$thr2->join(); 

sub msc{ ## make system call 
    system(@_); 
} 

這將等待兩者在它退出之前完成執行。我猜這是你想要的原始問題,對吧?如果您不希望發表評論並編輯您的帖子以更好地解釋它,我會再試一次。

+3

你應該真的使用'$^X'而不是依靠PATH中的'perl' – 2009-09-04 19:31:48

+0

從上下文中不難判斷,但是我查找了$^X:在使用英語的情況下它是$ EXECUTABLE_NAME - 「用於執行當前副本的名稱Perl「 – 2009-09-06 07:23:02

3

使用fork命令執行此操作,或者從shell腳本執行此操作。 shell腳本(僅限UNIX)看起來是這樣的:

nohup perl 1.pl & 
nohup perl 2.pl & 
exit 

而perl的命令如下所示:

if (! fork()) 
{ 
    system("perl 1.pl"); 
} 
if (! fork()) 
{ 
    system("perl 2.pl"); 
} 

有更好的方法來做到這一點,利用意義的寫一個腳本爭perl,但這會起作用。確保在你的父腳本中添加一個SIG_CHLD函數,並在其中添加wait()。你可以在這裏找到更多關於這種事件的處理。雖然系統(「perl 1.pl &」);可能有用(我還沒有測試過),我認爲分支和等待是一個不值一提的資源。

+1

欲瞭解更多信息:http://search.cpan.org/dist/perl/pod/perlipc.pod – Horus 2009-09-04 17:37:33

+0

這假設你在一個支持nohup的平臺上... – Kev 2009-09-04 20:17:11

+0

你可能還會分叉然後執行。 – 2009-09-07 15:54:53

4

可以fork關閉進程運行的命令你。如果你這樣做,你可能會想使用的exec代替system

#!/usr/bin/perl 

use strict; 
use warnings; 

die "could not fork: $!" unless defined (my $first_pid = fork); 

#first child 
exec $^X, "1.pl" unless $first_pid; 

die "could not fork: $!" unless defined (my $second_pid = fork); 

#second child 
exec $^X, "2.pl" unless $second_pid; 

waitpid $first_pid, 0; #wait for first child to finish 
waitpid $second_pid, 0; #wait for second child to finish 

參見:$^Xwaitpid