我想生成一个node.js子进程,并将其stdio附加到一个特定的tty,比如/dev/ttyS0
。我知道{ stdio: 'inherit' }
,但我不想将子对象连接到与父对象相同的tty。我知道pty.js
,但我不想让它连接到伪tty,我希望它连接到真实tty。我已经尝试将子进程的stdio管道连接到我用serialport
模块打开的tty:
var SerialPort = require('serialport');
var tty = new SerialPort('/dev/ttyS0');
var cp = require('child_process');
var myprocess = cp.spawn('myprocess');
myprocess.stdout.pipe(tty);
myprocess.stderr.pipe(tty);
tty.pipe(myprocess.stdin);
但它不适用于需要访问真实tty的进程,例如sudo。然而,我实际上并不打算专门使用sudo。
我最终找到了如何做到这一点,最初是使用tty模块,但后来我发现任何旧的WriteStream和ReadStream都可以做到,而不仅仅是tty。读/写流。最初,我尝试通过打开两次文件来创建ReadStream
和WriteStream
,但这不起作用,因为我只需要在r+
模式下打开一次文件。这就是我所做的:
var ttyFd = require('fs').open('/dev/ttyS0', 'r+');
require('child_process').spawn('myprocess', [], {stdio: [ttyFd, ttyFd, ttyFd]});
现在,当我在cp.spawn()
中放入tty
命令时,它会将终端的名称打印到终端。像sudo
和man
这样需要直接终端访问的命令可以完美地工作。