Приложение ведет себя по-разному, когда вывод перенаправляется на объект NSPipe? - PullRequest
1 голос
/ 28 августа 2010

У меня есть приложение, которое работает с сокетами и читает / записывает данные. Он использует Foundation framework в сочетании с CFNetwork и stdio .

Вот в чем проблема - когда он запускается из консоли (оболочка bash), он работает на 100% нормально и в этом нет ничего плохого. Однако, когда он вызывается другим приложением через NSTask, начинается безумие. Все приложение становится безумным, и оно только один раз читает сокет, а затем зависает (оно должно завершиться после того, как это будет сделано).

Это приложение не зависит от переменных среды или каких-либо других подобных вещей. Это не проблема пользователя. Когда он запускается, он отправляет простой запрос на сервер и ' printf ' отвечает и читает снова. Это происходит до тех пор, пока не будет получен пакет завершения.

Я действительно запутался, и мне кажется, что внутри фреймворка есть что-то, что делает приложение безумным, просто для того, чтобы разозлить программиста.

Кстати, я на Mac OS X Snow Leopard и приложение для той же платформы.

РЕДАКТИРОВАТЬ 1: Перенаправление stdout на NSPipe вызывает его. Но почему?

1 Ответ

0 голосов
/ 28 августа 2010

libc по-разному относится к каналу / файлу и консоли, подключенной к (псевдо) терминалу.В частности, политика буферизации по умолчанию отличается.Смотрите подробное обсуждение в этом вопросе переполнения стека .

Итак, вполне возможно, что программа, которая работает при подключении к (псевдо) терминалу, не будет работать с каналом.Если вам нужен более конкретный совет, вы должны опубликовать (хотя бы скелет) свой код.

...