0

ストリームを使用して、無関係のプロセス間でファイル記述子を渡すためのコードを作成しました。サーバーは、クライアントがファイル記述子を送信するのを待つ必要があります。サーバーコードは次のとおりです。

#include <sys/types.h>   
#include <sys/stat.h>  
#include <fcntl.h>  
#include <stropts.h>  
#include <stdio.h>  
#include <errno.h>  
#include <unistd.h>  

int  main(int argc, char *argv[])
{  
    int fd;  
    int pipefd[2];  
    pipe(pipefd);  
    close(pipefd[1]);  
    recvfd(pipefd[0]);  
    return 0;
}

void recvfd(int p)  
{
    struct strrecvfd rfdbuf;  
    struct stat statbuf;   
    int i;  
    i=ioctl(p, I_RECVFD, &rfdbuf);  
    printf("errno=%d\n",errno);  
    printf("recvfd=%d\n", rfdbuf.fd);  
}

しかし、エラー番号9-不正なファイル記述子を受け取ります。

4

4 に答える 4

2

注意:この回答が書かれてから、質問は大幅に変更されました。


どこから始めますか?

  • main()を返しますint
  • pipefd初期化されていません。
  • ランダムなファイル記述子を閉じます。
  • recvfd()別のランダムファイル記述子を呼び出します。
  • から値を返すことはありませんmain()
  • 値は使用しません#define
  • #includeこのコンパイルに必要なファイルは表示されません。
  • 未使用の変数fd
  • 未使用の変数statbuf
  • チェックされていない戻り値i

基本的な問題-初期化されていない変数の使用。

補助的な問題-限られたエラーチェック。


追加の問題:概念的には、ファイル記述子を渡すことができるサーバーが必要です。そのサーバーは、他の(無関係の)プロセスが作成できるファイル記述子から読み取る必要があります。マニュアルを注意深く見る必要がありますが、おそらくサーバーがUnixドメインソケットでリッスンするか、(名前付き)FIFOで読み取る必要があります。その後、他のプログラムはソケットまたはFIFOを開き、独自のファイル記述子をサーバーに送信できます。

于 2009-06-07T19:58:20.167 に答える
2

実行しているOSについては言及していません。I_RECVFDはSTREAMS拡張機能の一部であり、通常はSystem VベースのUnixオペレーティングシステム(AIXやSolarisなど)にのみ存在します。LinuxやBSDのような他のものはそれをサポートしておらず、Posixがsendmsg()とrecvmsg()を使用する代替手段を持っているのでおそらく決してサポートしないでしょう。

LinuxがサポートしていないのになぜLinuxに#definesI_RECVFDがあるのか​​わからないのではないかと思います。

于 2009-06-07T20:32:15.950 に答える
0

これは実際のコードですか?有効なファイル記述子を作成または受信する場所がありません。

于 2009-06-07T19:58:14.800 に答える
0

初期化することはありませんpipefd!行方不明

pipe(pipefd);

電話の前の行close...?

于 2009-06-07T19:58:50.557 に答える