2011-11-10 11 views
5

クライアントとサーバーを持つ分散シェルプログラムを作成しました。クライアントはサーバーにコマンド要求を送信し、サーバーはそのコマンドをローカルで実行し、そのコマンドの結果をクライアントに出力することになっています。 stdout/stderrをクライアントにリダイレクトする方法を調べるのに問題があります。私はexecvpを使ってコマンドを実行します。分散シェルプログラムのstdoutとstderrをソケットにリダイレクト

私はdup2を使用する必要があると思いますか?しかし、私はそれを適切に使用する方法を理解することはできません。どんな助け?

答えて

7

dup2()を使用すると、ソケットのファイルディスクリプタをstderrおよびstdoutファイルディスクリプタに複製するだけです。パイプにリダイレクトするのとほぼ同じことです。

cpid = fork(); 
if (cpid == 0) { 
    dup2(sockfd, STDOUT_FILENO); 
    dup2(sockfd, STDERR_FILENO); 
    execvp(...); 
    /*... etc. etc. */ 
+0

私はこの方法を試みましたが、出力はクライアント側に表示されません。しかし、sockfdの代わりに、私はちょうど私のソケットの変数を入れました。私はそれがソケットの実際のファイル記述子ではないと思いますか?どのようにソケットのファイル記述子が実際に何であるかを実際に調べるにはどうすればよいですか? – y3di

+0

ソケットファイルディスクリプタ(サーバー上)は、 'accept()'によって返されたものです - あなたが 'fork()'/'execvp()を使用していなかった場合、 '。これが使用している場合は、コードに別の問題がある可能性があります。 – Dmitri

+0

出力が出て来るためにクライアントサイドで行うべきであるコードはありますか? [サーバーがそのポートに何かを書いているかのように] read()か何かを行う必要がありますか? – y3di

関連する問題