IPC between C and Node.js results in "TypeError: Unsupported fd type: UNKNOWN"
IPC between C and Node.js results in "TypeError: Unsupported fd type: UNKNOWN"
我正在尝试在一个简单的 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();
这两个程序在此处都被重写为 post,但它们抓住了我要完成的任务的本质。
问题 1:
如何修复我的代码,使错误消息不再出现?
问题二:
我觉得这两个进程之间有更好的通信方式。有什么建议吗?
删除关闭文件和结束套接字的行后,我没有看到此错误再次发生:
socket.on('close', () => {
// fs.closeSync(fd);
// socket.end();
// socket.destroy();
listen();
});
这似乎已经解决了!
我正在尝试在一个简单的 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();
这两个程序在此处都被重写为 post,但它们抓住了我要完成的任务的本质。
问题 1: 如何修复我的代码,使错误消息不再出现?
问题二: 我觉得这两个进程之间有更好的通信方式。有什么建议吗?
删除关闭文件和结束套接字的行后,我没有看到此错误再次发生:
socket.on('close', () => {
// fs.closeSync(fd);
// socket.end();
// socket.destroy();
listen();
});
这似乎已经解决了!