如何将终端切换到使用NSTask启动的进程的新子进程



我用下面描述的方法制作了一个伪终端:http://lists.apple.com/archives/student-dev/2005/Mar/msg00019.html

终端本身工作良好。无论如何,问题是终端不能切换到子进程。例如,我用NSTask启动bash,如果我在bash中执行ftp,它会自动停止。

ftp
ftp
ftp> 
[1]+  Stopped                 ftp
bash-3.2$ 

如果我尝试用fg继续ftp,它会安静地终止。(我用Activity Monitor检查了这个)

fg
fg
ftp
bash-3.2$ 
fg
fg
bash: fg: current: no such job
bash-3.2$ 

我认为它需要更多的基础设施(完成伪终端)来将控制切换到子进程。要做到这一点需要什么?

我最终可以通过创建pty设备来做到这一点。要使一个程序表现得像"终端",它必须在交互式终端中执行,这就需要伪终端设备。

不幸的是,NSTask不支持任何pty的能力,所以我不得不进入BSD层。

下面是我当前的实现:https://github.com/eonil/PseudoTeletypewriter.Swift

sudo工作良好,我相信ssh也应该工作。

看一下MFTask和PseudoTTY的源代码。app(在Mac OS X 10.6上运行).

见:http://www.cocoadev.com/index.pl?NSTask

关于pty命令行工具,请参见这里。

最新更新