2012-05-22 57 views
3

我有兩個腳本script_a和script_b。 script_a調用script_b。 script_b分叉兩個進程。如下所示。fork + exec +調用者不應該等孩子

script_a等待script_b的父級和子級完成。 我希望script_a在不等待script_b的子進程的情況下繼續。

我爲此做了什麼是在script_b中,我添加了以下代碼。

if (! $f_id) { 
    close STDOUT; 
    close STDERR; 
    exec("sleep 10; echo 'i am child'"); 
} 

這適用於我。 script_a不再等待子進程。

這裏我的問題是, 1.這是正確的方法嗎? 2.父母和孩子的過程是否共享相同的STDOUT和STDERR,並且如果出現競爭條件,我是否會遇到麻煩? 3.是否有更好的方法來做到這一點?

在此先感謝您的幫助。

script_a.pl

#! /usr/local/bin/perl 
print `script_b.pl`; 

script_b.pl

#! /usr/local/bin/perl 

$f_id = fork(); 

if (! $f_id) { 
    exec("sleep 10; echo 'i am child'"); 
} 

if ($f_id) { 
    print "i am parent\n"; 
} 
+0

1)你可能只是分叉script_a,但不知道你的**真實**問題很難說。 2)反引號運算符爲孩子設置一個新的STDOUT。 STDERR是分享的。 – salva

+0

@Salva這是我的實際代碼的縮小版本,所以它可能看起來像我可以分叉script_a,但它不是我真正的senario中的選項。 script_b中的父母和孩子是否會共享相同的STDOUT和STDERR? – Usha

+0

是的,他們是共享的 – salva

回答

1

而不是在script_a中使用``。我們已經在script_a中重定向了STDOUT和STDERR。 喜歡的東西

script_a

system("script_b.pl > /var/tmp/out_file 2>&1"); 

script_b

#! /usr/local/bin/perl 

$f_id = fork(); 

if (! $f_id) { 
    exec("sleep 10; echo 'i am child'"); 
} 

if ($f_id) { 
    print "i am parent\n"; 
} 

這樣主叫因此未等待在EXEC孩子完成。

感謝您的幫助。

+0

雖然不是正確的方法。 – Usha

0

``反引號在Perl等待命令完成。因此,如果您不希望父級進程在後臺放入系統(命令&)

+0

我想等待父母返回。但我不想等孩子。如果我提出的解決方案存在任何問題,您能否告訴我? – Usha