2014-03-04 66 views
1

我在通過system調用來調用「slave」perl腳本的「master」腳本中創建Perl線程。如果這不好,請隨時給我啓發。有時被調用的從腳本將失敗,並且die。我如何在主腳本中知道這一點,以便我可以殺死主人?如何知道線程是否在Perl中使用die

有沒有一種方法可以向主線程返回一條消息,指示從服務器已正確完成?我明白,儘管在一個線程中使用exit是不好的做法。請幫忙。

============================================== ==================================== 編輯:

澄清,我有約8每個運行一次的線程。它們之間存在依賴關係,所以我有阻止某些線程在初始線程完成之前運行的障礙。

此外,系統調用與tee完成,所以這可能是返回值很難得到的原因的一部分。
system("((" . $cmd . " 2>&1 1>&3 | tee -a $error_log) 3>&1) > $log; echo done | tee -a $log"

回答

2

你描述你的問題的方式,我不認爲使用線程是要走的路。我會更傾向於分叉。無論如何,調用「系統」都會分叉。

use POSIX ":sys_wait_h"; 

my $childPid = fork(); 
if (! $childPid) { 
    # This is executed in the parent 
    # use exec rather than system, so that the child process is replaced, rather than 
    # forking a new subprocess (or maybe even shell) to run your child process 
    exec("/my/child/script") or die "Failed to run child script: $!"; 
} 

# Code here is executed in the parent process 
# you can find out what happened to the parent process by calling wait 
# or waitpid. If you want to be able to continue processing in the 
# parent process then call waitpid with second argument WNOHANG 

# EG. inside some event loop, do this 
if (waitpid($childPid, WNOHANG)) { 

    # $? now contains the exit status of child process 
    warn "Child had a problem: $?" if $?; 

} 
+0

我選擇使用線程的主要原因是因爲我有依賴和需要爲某些工作設置障礙。這可以用叉子完成嗎?我對Perl中的多線程知之甚少。 – Stuart

+0

有沒有辦法讓slave線程使用'system'向主線程返回一個值? – Stuart

相關問題