の使用は問題ないように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 */
}
}
上記は非常に基本的なサーバー(一度に1つのクライアントのみ)のコアであり、接続を受信すると、コマンドを実行するための新しいプロセスをフォークし、そのstderrとstdoutをソケットを介してクライアントに送信します。うまくいけば、問題を調べることで問題を解決できますが、コードの機能を理解せずにコードをコピーするだけではいけません。
最初にtelnetクライアントに接続してテストしてみてください...telnetで動作するが、クライアントプログラムでは動作しない場合は、クライアントプログラムの問題を探してください。