Ваше использование 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, но не с вашей клиентской программой, то найдите проблемы в вашей клиентской программе.