Использование STDIN/STDOUT в качестве сокета
У меня клиентский процесс запускает процесс сервера с xinetd. Насколько я понимаю, сервер оживает, имея возможность читать с клиента через свой STDIN и писать клиенту через его STDOUT. По разным причинам (в основном из-за того, что сервер может использовать select() и затем read() или recv()), я хочу иметь возможность каким-то образом преобразовать STDIN и STDOUT в сокет, а затем выполнить на нем обычный сокет-ввод, как я буду с другими серверами, к которым будет подключаться мой сервер.
Можно ли это сделать? Это даже значимый вопрос?
1 ответ
Все упомянутые вами вызовы функций могут использоваться в файловых дескрипторах с номерами STDIN_FILENO и STDOUT_FILENO (от <unistd.h>
). Так что я бы рискнул вам не нуждаться в каких-либо преобразованиях.
РЕДАКТИРОВАТЬ: немного неортодоксально, но вы пытались писать на STDOUT_FILE или читать STDIN_FILENO на вашем сервере? Очень быстро взглянув на код xinetd, похоже, что он просто дублирует (f) открытый сокет fd на все fds сервера. Может быть, вы можете использовать любой из них в качестве полного дуплекса.
Я только посмотрел здесь
for ( fd = 0 ; fd <= MAX_PASS_FD ; fd++ )
{
if ( dup2( descriptor, fd ) == -1 )
{
msg_resume();
msg( LOG_ERR, func,
"dup2( %d, %d ) failed: %m", descriptor, fd ) ;
_exit( 1 ) ;
}
}