2009-06-07 13 views
0

ストリームを使用して関連のないプロセス間でファイル記述子を渡すためのコードを記述しました。 サーバーは、クライアントがファイル記述子を送信するのを待つ必要があります。ここ は、サーバーのコードです:ioctl()がブロックされないのはなぜですか?

#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受け取る - 不正なファイルディスクリプタを。

+0

使用しているオペレーティングシステムは? OSを知らなくても、OSコールに関する質問に答えるのは難しいです。 – Dipstick

+0

なぜそれがエラーを返すと思いますか?このコードでは、ioctlの戻り値をチェックすることさえありません。 -1でなければ、errnoは変更されず、以前のシステムコールの値を持つことができます(例えば、ダイナミックローダーやスタートアップルーチンなど)。 – mark4o

答えて

2

実行中のOSについては言及していません。 I_RECVFDは、通常はSystem VベースのUnixyオペレーティング・システム(AIXおよびSolarisなど)にのみ存在するSTREAMS拡張の一部です。 LinuxやBSDのように、Posixがsendmsg()とrecvmsg()を使用しているため、LinuxやBSDのようなものは、POSIXをサポートしておらず、恐らく決してそうではありません。

Linuxが#I_RECVFDをサポートしていないのはどうしてわからないのでしょうか?

+0

私はfifo(パイプではなく)とioctl()を使用しなければならず、あなたが言ったように、Linuxでは動作しませんが、Solarisでは動作します。 – Anonymous

0

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

2

NB:この回答が書かれて以来、質問は大幅に変更されています。


ここから始めます。

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

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

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


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

+0

技術的には、main()からの戻り値の型を省略することは大丈夫です(ただし、_only_の場合)。この場合、int型が仮定されます。同様に、return文をmain(again、main _only_)から省略すると、暗黙の 'return 0'があります。しかし、それでもやはり悪い習慣です。 –

+1

現在のC標準であるC99にはありません。 C99には、「暗黙のint」戻り値の型などはありません。 –

0

pipefdを初期化しません!欠けている

pipe(pipefd); 

行の前にcloseコール...?