Как переключить терминал на новый дочерний процесс процесса, запущенного с помощью NSTask?

Я сделал псевдо-терминал с помощью метода, описанного здесь: 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$ 

Я думаю, что ему нужна дополнительная инфраструктура (которая дополняет псевдотерминал), чтобы переключить управление на дочерний процесс. Что для этого требуется?


person eonil    schedule 25.09.2011    source источник
comment
что за платформа? iOS? Мак? линукс?   -  person Davide Piras    schedule 25.09.2011
comment
@DavidePiras У меня Mac OS X 10.7.   -  person eonil    schedule 25.09.2011


Ответы (2)


Наконец-то я смог сделать это, создав pty устройство. Чтобы программа вела себя как «Терминал», она должна выполняться в интерактивном терминале, а для этого требуется псевдотерминальное устройство.

К сожалению, насколько мне известно, NSTask не поддерживает возможности pty, поэтому мне пришлось перейти на уровень BSD.

Вот моя текущая реализация: https://github.com/eonil/PseudoTeletypewriter.Swift

sudo работает хорошо, и я считаю, что ssh тоже должно работать.

person eonil    schedule 12.01.2015

Взгляните на исходный код MFTask и PseudoTTY.app (который работает в Mac OS X 10.6).

См.: http://www.cocoadev.com/index.pl?NSTask.

Инструмент командной строки pty см. здесь.

person tim    schedule 26.09.2011