2016-06-15 10 views
1

を出るまで、産卵プロセスが なっnodejs、 なぜさんは、第1の現象を見てみましょう親が

Nodejsコード:

const cp = require('child_process'); 

var ls = cp.spawn('ls', ['/']); 

ls.stdout.on('data', (data) => { 
    console.log(`stdout: ${data}`); 
}); 

ls.stderr.on('data', (data) => { 
    console.log(`stderr: ${data}`); 
}); 

ls.on('close', (code) => { 
    console.log(`child process closed with code ${code}`); 
}); 

while(true){} 

実行このコードをnodejs、表示された何も、何のイベントがトリガされなかったようです。

が次に実行する別のシェルで "| | grepのLSのPS -ef GRPE -v grepの" を、結果は次のとおりです。

liyuanq+ 10995 10990 0 11:06 pts/3 00:00:00 [ls] <defunct> 

コード削除する場合:

while(true){} 

ノードプロセスの終了を、オンデータイベントをトリガした。

問題は、ノードが親ノードプロセスが終了するまでジョブが実際に終了したときに、生成されたプロセスを閉じないという問題です。

私の環境:

OS:Debianの8.4 x86_64版

ノード:V6.1.0

答えて

2

非常に興味深い観察、ありがとうございました!子供に()待って実行専用のスレッドがある場合は、子供が見られます()は、子が終了するとのギャップがあると親が待って実行する場合

、このシナリオは

を発生しませんそのギャップの中に存在しない。

ノードには、スレッドが1つしかなく、無限ループが実行されているため、イベントループに入り、子の終了を傍受してタスクリストから子のIDをクリアする方法がありません。

長いループでwhileループをsetTimeoutに置き換えると、スレッドは空きCPUを獲得し、子を待ってタスクリストからクリアします。

これが役に立ちます。

+0

私の神!解決済み!ありがとうございました! –

関連する問題