Все привет!
Есть такая проблема. Если программу запускает xinetd-демон, то весь вывод, например, fprintf(stderr, "error")/fprintf(stdout, "message"), пишется в канал соединения и отправляется клиенту. Естественно, что если клиент не ожидает ничего такого, то отваливается. Как правильно избежать такого вывода клиенту? Сервер имеет возможность подключения плагинов, поэтому простое исключение подобных вещей из кода не решит проблему

.
Здравствуйте, Аноним, Вы писали:
А>Есть такая проблема. Если программу запускает xinetd-демон, то весь вывод, например, fprintf(stderr, "error")/fprintf(stdout, "message"), пишется в канал соединения и отправляется клиенту. Естественно, что если клиент не ожидает ничего такого, то отваливается. Как правильно избежать такого вывода клиенту? Сервер имеет возможность подключения плагинов, поэтому простое исключение подобных вещей из кода не решит проблему :( .
#!/bin/sh
exec 2>/dev/null # или в лог
exec $*
А без stdout никак — должен же клиент получить хоть что-нибудь.
Здравствуйте, Roman Odaisky, Вы писали:
RO>RO>#!/bin/sh
RO>exec 2>/dev/null # или в лог
RO>exec $*
RO>
RO>А без stdout никак — должен же клиент получить хоть что-нибудь.
Спасибо за совет! stdout тоже попробуем переправить.
Клиент получает сообщения в виде определенной структуры. Простой вывод просто убивает коннект. Мы пробуем прикрутить сторонние разработки, вот и наткнулись
Здравствуйте, Аноним, Вы писали:
А>Есть такая проблема. Если программу запускает xinetd-демон, то весь вывод, например, fprintf(stderr, "error")/fprintf(stdout, "message"), пишется в канал соединения и отправляется клиенту. Естественно, что если клиент не ожидает ничего такого, то отваливается. Как правильно избежать такого вывода клиенту? Сервер имеет возможность подключения плагинов, поэтому простое исключение подобных вещей из кода не решит проблему
.
Можно сделать, чтобы stderr/stdout указывали на /dev/null
int handle = open("/dev/null", O_RDWR);
dup2(handle, fileno(stdout);
dup2(handle, fileno(stderr);
printf("test1\n");
fprintf(stdout, "test2\n");
fprintf(stderr, "test3\n");
При завершении работы сервера закрыть close(habdle);