Проблема с функцией записи в Linux - PullRequest
2 голосов
/ 02 июня 2010

Я пытаюсь написать 2 серверные / клиентские программы под Linux, в которых они общаются через именованные каналы. Проблема в том, что иногда, когда я пытаюсь записать с сервера канал, который больше не существует (клиент остановился), я получаю ошибку «Ресурс временно недоступен», и сервер полностью останавливается.

Я понимаю, что это вызвано использованием параметра O_NONBLOCK при открытии канала fifo, указывающего точку, в которой программа обычно ожидает, пока она не сможет снова записать в файл, но есть ли способ остановить это поведение остановить всю программу, если возникнет проблема (не должна ли команда записи вернуть -1 и программа продолжит нормально)?

И еще одна странная вещь: эта ошибка возникает только при запуске программ вне ide (eclipse). Если я запускаю обе программы в eclipse, при ошибке функция записи просто возвращает -1, и программы продолжаются нормально.

Ответы [ 4 ]

6 голосов
/ 02 июня 2010

Если вы хотите, чтобы write() возвращало -1 при ошибке (и устанавливало errno в EPIPE) вместо полной остановки сервера , когда конец записи вашего канала не подключен, должен игнорировать сигнал SIGPIPE с signal( SIGPIPE, SIG_IGN ).

2 голосов
/ 02 июня 2010

Проблема с этим неопределенным поведением странная, у вас может быть проблема с памятью или вы пропустили тест. (или Eclipse делает что-то особенное для обработки сигналов?)

0 голосов
/ 02 июня 2010

Цитировать раздел 2 справочной страницы для записи: "[errno =] EPIPE Предпринята попытка записи в канал или FIFO, который не открыт для чтения каким-либо процессом, или который имеет только один открытый конец (или в дескриптор файла, созданный сокетом (3SOCKET), используя тип SOCK_STREAM, который больше не подключен к конечной точке однорангового узла). Сигнал SIGPIPE также будет отправлен потоку. Процесс умирает, если не были приняты специальные условия для перехвата или игнорирования сигнала."[Выделить мое]

Как сказал Платип, вам нужно игнорировать сигнал SIGPIPE: signal(SIGPIPE, SIG_IGN). Вы также можете перехватить сигнал и по-другому обработать отключение канала на вашем сервере.

0 голосов
/ 02 июня 2010

может быть, вы можете просто обернуть его в оператор try..catch?

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