Ваше использование dup2()
выглядит нормально, поэтому проблема, вероятно, в другом. Простая программа, которую я собрал для тестирования, не имеет проблем, с которыми вы столкнулись, поэтому я просто пройдусь по ее ядру (вокруг области fork()
/execvp()
), опустив для краткости некоторые проверки ошибок:
int lsock, /* listening socket */
csock; /* active connection's socket */
pid_t cpid; /* child process ID from fork() */
char *cmd = "somecommand";
char *cmd_args[] = { "somecommand",
"firstarg",
"secondarg",
"howevermanyargs",
NULL }; /* note: last item is NULL */
/* ...
call socket(), bind(), listen(), etc.
... */
for (;;) { /* loop, accepting connections */
if ( (csock = accept( lsock, NULL, NULL )) == -1) exit(1);
cpid = fork();
if (cpid < 0) exit(1); /* exit if fork() fails */
if ( cpid ) {
/* In the parent process: */
close( csock ); /* csock is not needed in the parent after the fork */
waitpid( cpid, NULL, 0 ); /* wait for and reap child process */
} else {
/* In the child process: */
dup2( csock, STDOUT_FILENO ); /* duplicate socket on stdout */
dup2( csock, STDERR_FILENO ); /* duplicate socket on stderr too */
close( csock ); /* can close the original after it's duplicated */
execvp( cmd, cmd_args ); /* execvp() the command */
}
}
Вышеупомянутое является ядром очень простого сервера (только один клиент за раз), который, когда он получает соединение, создает новый процесс для запуска команды и отправляет свои stderr и stdout клиенту через сокет. Надеюсь, вы сможете решить свою проблему, изучив ее, но не копируйте код, не понимая, что он делает.
Попробуйте сначала подключиться к клиенту telnet... если он работает с telnet, но не с вашей клиентской программой, тогда ищите проблемы в вашей клиентской программе.
person
Dmitri
schedule
12.11.2011