2013-07-18 4 views
4

Итак, я нерест несколько процессов и пытается выяснить PID процесса, когда он получает некоторые данные, вот мой код:Получение правильного идентификатора процесса из дочерних процессов

var mod_child_process = require('child_process'); 
var mod_events  = require('events'); 

for (var i=0; i<3; ++i) 
{ 
    var childProcess; 

    childProcess = mod_child_process.spawn('HandShake.exe', ['N:192.168.200.250:3001:1', 'Q:TIME']);  

    childProcess.stdout.on('data', function(data) {   
    console.log('stdout (' + childProcess.pid + '): ' + data); 
    }); 

} 

всегда возвращается один pid

stdout (78748): 18/7/13 15:46:26 
stdout (78748): 18/7/13 15:46:26 
stdout (78748): 18/7/13 15:46:27 

Заранее спасибо.

ответ

5

Вы используете обзор с переменной childProcess. Переменные в JavaScript - это область действия. Из-за этого переменная не является исключением для цикла.

Упрощенный пример кода действует как у вас есть:

for (var i = 0; i < 3; ++i) { 
    var someNumber = i; 

    setTimeout(function() { 
     console.log(someNumber); 
    }, 100); 
} 

выходы: 2, 2, 2

И починки:

for (var i = 0; i < 3; ++i) { 
    (function() { 
     var someNumber = i; 

     setTimeout(function() { 
      console.log(someNumber); 
     }, 100); 
    })(); 
} 

Вы хотите, чтобы обернуть вашу логику в closure, так что переменная childProcess существует с этой областью. Вышеуказанный код выводит ожидаемый 0, 1, 2

3

Похож на проблему с закрытием. Передайте переменную цикла в функцию, так что область действия не изменяется.

var mod_child_process = require('child_process'); 
var mod_events  = require('events'); 

for (var i=0; i<3; ++i) 
{ 
    var childProcess; 
    childProcess = mod_child_process.spawn('cmd.exe'); 
    displayid(childProcess); 
} 

function displayid(childProcess){ 
    childProcess.stdout.on('data', function(data) {   
    console.log('stdout (' + childProcess.pid + '): ' + data); 
    }); 
} 

Выход

stdout (368): Microsoft Windows [Version 6.2.9200] 
stdout (20268): Microsoft Windows [Version 6.2.9200] 
stdout (15728): Microsoft Windows [Version 6.2.9200] 

Без него

stdout (10964): Microsoft Windows [Version 6.2.9200] 
stdout (10964): Microsoft Windows [Version 6.2.9200] 
stdout (10964): Microsoft Windows [Version 6.2.9200] 
Смежные вопросы