write () вызывает фатальный сбой, когда filedescriptor становится недействительным - PullRequest
1 голос
/ 01 апреля 2010

Я пишу приложение для iPhone с веб-сервером.Для обработки веб-запроса я беру веб-запрос и записываю () в него данные, которые хочу отправить обратно.

Когда я пытаюсь загрузить файл среднего размера (3–6 МБ), он работает нормально,но если я отменяю загрузку на полпути, приложение вылетает и не оставляет следов ошибки.Я думаю, что дескриптор файла становится недопустимым в середине записи и вызывает сбой.Я действительно не знаю, является ли это причиной сбоя, я просто предполагаю.

Я основываю свой веб-сервер на этом примере.

NSString *header = @"";
NSData *data = [NSData dataWithContentsOfFile:fullPath];
write (fd, [header UTF8String], [header length]);
write(fd, [data bytes], [data length]);
close(fd);

Кто-нибудь знает, как это исправить?Я думал о том, чтобы разбить данные на части и затем написать каждую часть, но я не думаю, что это поможет.

1 Ответ

2 голосов
/ 08 апреля 2011

Похоже, ваше приложение, вероятно, получает сигнал SIGPIPE в результате попытки записи в сломанный сокет. Вам нужно будет игнорировать сигнал SIGPIPE в вашем коде, используя что-то вроде:

#include <signal.h>

signal (SIGPIPE, SIG_IGN);

Я предлагаю вам сделать это в верхней части вашей main() функции.

Кроме того, вам может быть лучше использовать NSInputStream / NSOutputStream или их аналоги Core Foundation, CFReadStream / CFWriteStream, поскольку их можно использовать для использования цикла выполнения для разрешения асинхронной работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...