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

时间:2011-09-25 11:08:19

标签: macos terminal spawn pty job-control

我使用此处描述的方法创建了一个伪终端:http://lists.apple.com/archives/student-dev/2005/Mar/msg00019.html

终端本身运作良好。无论如何问题是终端无法切换到子进程。例如,我使用bash启动了NSTask,如果我在ftp内执行bash,则会自动停止。

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

如果我尝试使用ftp继续fg,它会安静地终止。 (我使用活动监视器进行了检查)

fg
fg
ftp

bash-3.2$ 

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

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

2 个答案:

答案 0 :(得分:1)

我最终可以通过创建pty设备来实现此目的。为了使程序表现得像"终端",它必须在交互式终端中执行,并且需要伪终端设备。

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

这是我当前的实施:https://github.com/eonil/PseudoTeletypewriter.Swift

sudo效果很好,我相信ssh也应该有用。

答案 1 :(得分:0)

查看MFTask和PseudoTTY.app的源代码(适用于Mac OS X 10.6)。

请参阅:http://www.cocoadev.com/index.pl?NSTask

对于pty命令行工具,请参阅here