簡體   English   中英

Child_process拋出錯誤:寫EPIPE

[英]Child_process throw an Error: write EPIPE

我只是練習一些關於child_process @the link的節點js代碼我的節點版本是Windows 7上的V5.2.0。

// master.js
var cp=require("child_process");

var np=cp.fork("./console.js");               // line B

// block C
np.stdout.on("data",function(data){
   console.log("child process output:"+data);
});

np.stderr.on("data", function(err){
    console.log("child process output error:"+err);
});

np.on("close", function () {
    console.log("child process exit");
});

// end of block C



np.send({Hello:"world"});
np.on("message",function(msg){
    console.log("parent process got a msg:",msg);
});




// console.js

#!/usr/bin/env node

var aa=1;
console.log("The aa is :"+aa);


process.on("message", function (m) {
    console.log("child process got message:",m);
});

process.send({foo:"bar"});

1)我運行上面的代碼,我得到了錯誤:編寫EPIPE。 我用谷歌搜索,但找不到任何有用的答案。 我只是nodejs的新手,我按照官方文檔進行了一些修改,然后示例代碼失敗。 我發現如果我注釋掉塊C中的代碼,則示例代碼就可以了。 所以我想知道,如果np.stdout / np.stderr偵聽“數據”,為什么代碼會拋出錯誤?

$ The aa is :1
events.js:142
      throw er; // Unhandled 'error' event
      ^

Error: write EPIPE
    at exports._errnoException (util.js:856:11)
    at process.target._send (internal/child_process.js:607:18)
    at process.target.send (internal/child_process.js:508:19)
    at Object.<anonymous> (D:\Practice\..\console.js:
11:9)
    at Module._compile (module.js:399:26)
    at Object.Module._extensions..js (module.js:406:10)
    at Module.load (module.js:345:32)
    at Function.Module._load (module.js:302:12)
    at Function.Module.runMain (module.js:431:10)
    at startup (node.js:141:18)

2)我修改master.js代碼,運行如下代碼:

var cp=require("child_process");

var np=cp.spawn("node", ["./console.js"]);

np.send({Hello:"world"});
np.on("message",function(msg){
    console.log("parent process got a msg:",msg);
});

它拋出一個錯誤:

np.send({Hello:"world"});
   ^

TypeError: np.send is not a function

我重新訪問了Node js官方文檔 ,但我發現spawn()和fork()並沒有很大的不同。 所以我想知道為什么np.send不是函數?

官方文檔沒有提及一些要點嗎?

1 /關於找不到np.send方法

當子節點被分叉或其管道設置為IPC時,child_process.send方法可用

叉子

使用child_process.fork()時,您可以使用child.send(message [,sendHandle] [,callback])寫入子級,並且該子級上的'message'事件會接收到消息。

IPC

'ipc'-創建一個IPC通道,用於在父級和子級之間傳遞消息/文件描述符。 一個ChildProcess最多可以具有一個IPC stdio文件描述符。 設置此選項將啟用ChildProcess.send()方法。 如果孩子將JSON消息寫入此文件描述符,則將觸發ChildProcess.on('message')。 如果子級是Node.js程序,則IPC通道的存在將啟用process.send()和process.on('message')。

var child = spawn('cat', ['index.js', {stdio: 'ipc'});

2 /關於EPIPE

EPIPE表示當另一端終止連接時,您正在寫入管道或套接字。

這就是說,我發現您的觀察結果令人懷疑,因為如果您不打開管道,則不會填充孩子的stdout && stderr && stdin對象。 因此,它通常會引發類似TypeError: Cannot read property 'on' of null的錯誤TypeError: Cannot read property 'on' of null

然后我仔細檢查了一下文檔,發現fork非常特別,我注意到它們沒有提供任何stdio選項。 但是,據說它啟用了send方法。 我的理解是fork方法不會打開任何管道,只有send方法的on('message')機制可用。

這段代碼有效,而console.js保持不變

// master.js
var cp=require("child_process");

var np = cp.fork("./console.js");

np.on("close", function () {
    console.log("child process exit");
});


np.send({Hello:"world"});
np.on("message",function(msg){
    console.log("parent process got a msg:",msg);
});

要執行類似的操作(但使用spawn),我們應該利用stdin編寫,stdout或stderr進行監聽,

// master.js
var cp=require("child_process");

var np = cp.spawn(process.argv[0], ["./console.js"], {stdio: 'pipe'});

np.stdout.on("data",function(data){
   console.log("child process output:"+data);
});

np.stderr.on("data", function(err){
    console.log("child process output error:"+err);
});

np.on("close", function () {
    console.log("child process exit");
});

np.stdin.end(JSON.stringify({Hello:"world"}))

console.js

#!/usr/bin/env node

var aa=1;
console.log("The aa is :"+aa);


process.stdin.on("data", function (m) {
    console.log("child process got message:", m.toString());
});

process.stdout.write(JSON.stringify({foo:"bar"}))
// process.send({foo:"bar"});

而已。 我無法為您提供有關您提供的特定錯誤的准確答案。

我希望這有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM