Вскоре после запуска вашей программы используйте вызов dup (2) для создания дубликатов дескрипторов файлов для fd 1 (stdout) и 2 (stderr).Сохраните возвращенные значения для дальнейшего использования.
Вызовите close (2) для FD 1 и FD 2.
Дважды вызовите openpty (2).Первый возвращенный мастер должен быть FD 1 (потому что это первый доступный FD), а второй мастер должен быть 2. Сохраните два подчиненных FD на потом.Не беспокойтесь о сохранении параметра name.Теперь, когда ваша программа printf (2) в stdout или NSLogs для stderr, данные будут записываться на ваши подчиненные FD.
Теперь вы должны выбрать, хотите ли вы опросить подчиненные FD илиустановите сигнал, когда есть данные для чтения.
Для опроса используйте NSTimer.В вашем таймере используйте select (2) на двух подчиненных FD, чтобы увидеть, есть ли у них данные.Если они читают (2), а затем выводят его в ваше окно.Вы также можете заставить два подчиненных FD использовать неблокирующий IO (используйте fcntl (2), чтобы F_SETFL подчиненных FD обращался к O_NONBLOCK).Тогда вам не нужно выбирать (2), вы просто читаете (2), и он вернет ноль, если нечего читать.
Для сигнализации используйте fcntl (2) для F_SETFL подчиненных FD для O_ASYNC,Затем используйте сигнал (3) для установки обработчика сигнала для SIGIO.Когда вызывается ваш обработчик сигнала, используйте один из двух методов, которые я описал в разделе опроса.
Если во время выполнения вы хотите отменить все эти изменения и вернуть все в нормальное состояние, сделайте следующее:
Вызовите close (2) на FD 1 и FD 2.
Вызовите dup (2) на двух FD, сохраненных с шага 1 в первом разделе,выше.Сделайте dup (2) в правильном порядке, чтобы stdout использовал FD 1, а stderr использовал FD 2.
Теперь все, что записано в stdout и stderr, перейдет к исходным FD.