bugfix> c > 投稿

単純な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: 2つのプロセス間で通信するより良い方法があるように感じます。助言がありますか?

回答 1 件
  • ファイルを閉じてソケットを終了する行を削除した後、このエラーが再び発生することはありません。

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

    これで修正されたようです!

あなたの答え