您的使用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 但不适用于您的客户端程序,则在您的客户端程序中查找问题。