Как переключить терминал на новый дочерний процесс, запущенный с помощью 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
оканчивается тихо. (Я проверил это с помощью Activity Monitor)
fg
fg
ftp
bash-3.2$
fg
fg
bash: fg: current: no such job
bash-3.2$
Я думаю, что для переключения управления на дочерний процесс нужна еще какая-то инфраструктура (которая завершает псевдотерминал). Что для этого нужно?
2 ответа
Я мог бы наконец сделать это, создав pty
устройство. Чтобы программа работала как "Терминал", она должна выполняться в интерактивном терминале, и для этого требуется псевдотерминальное устройство.
К сожалению, AFAIK, 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 смотрите здесь.