C和Node.js之间的IPC导致“TypeError:Unsupported fd type:UNKNOWN”

时间:2018-05-25 07:39:41

标签: c node.js ipc

我正在尝试在简单的C程序和Node.js之间设置进程间通信。下面的代码工作得很好,但是经过一段时间(约5-10分钟)后,Node.js应用程序崩溃并出现以下错误消息:

TypeError: Unsupported fd type: UNKNOWN
     at createHandle (net.js:70:9)
     at new Socket (net.js:209:20)
     at fs.open (/home/pi/src/components/named_pipe_receiver.ts:22:23)
     at FSReqWrap.oncomplete (fs.js:135:15)

C:

#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <time.h>
#include <stdlib.h>

int main() {
  int fd;
  char * fifo_name = "/tmp/fifo";

  mkfifo(fifo_name, 0666);

  char buff[20];
  time_t my_time;

  while (1) {
    fd = open(fifo_name, O_WRONLY);

    time(& my_time);
    strftime(buff, 20, "%Y-%m-%d %H:%M:%S", localtime(& my_time));
    write(fd, buff, sizeof(buff));

    close(fd);
    usleep(10000);
  }

  return 0;
}

Node.js(v8.9.4):

const C = require('constants');
const fs = require('fs');
const net = require('net');

function listen() {
  const fd = fs.openSync('/tmp/fifo', C.O_NONBLOCK | C.O_RDONLY);
  const socket = new net.Socket({ fd, readable: true, writable: false });

  socket.on('data', (data) => {
    console.log(data.toString());
  });

  socket.on('close', () => {
    fs.closeSync(fd);
    socket.end();
    socket.destroy();
    listen();
  });

  socket.on('error', () => {
    process.exit(1);
  });
}

listen();

这两个程序都被重写为发布在这里,但它们捕获了我想要完成的内容。

问题1: 如何修复我的代码,以便错误消息永远不会再出现?

问题2: 我觉得这两个流程之间有更好的沟通方式。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

删除关闭文件的行并结束套接字后,我没有看到再次出现此错误:

socket.on('close', () => {
  // fs.closeSync(fd);
  // socket.end();
  // socket.destroy();
  listen();
});

这似乎已经解决了!