_pipe

提供: RAD Studio
移動先: 案内検索

fcntl.h:インデックス への移動


ヘッダーファイル

io.h, fcntl.h

カテゴリ

入出力ルーチン

構文

int _pipe(int *handles, unsigned int size, int mode);

説明

読み出し/書き込みパイプを作成します。

_pipe 関数は,プロセス間で情報を受け渡すために使用できる無名パイプを作成します。このパイプは,読み出しと書き込みの両方の目的で開くことができます。ディスクファイルと同様に,パイプとの間で読み取りや書き込みを行うことができますが,パイプに関連付けられた名前や持続的ストレージはありません。パイプから読み取られたデータやパイプに書き込まれたデータは,オペレーティングシステムによって管理されるメモリバッファ内にのみ存在します。

読み取りハンドルは handles[0] に返され,書き込みハンドルは handles[1] に返されます。このプログラムは,その後の read,write,dup,dup2,close などの呼び出しで,これらのハンドルを使用できます。すべてのパイプハンドルが閉じられた時点で,そのパイプは破棄されます。

内部パイプバッファのサイズは size で示されます。推奨の最小値は 512 バイトです。

変換モードは,次のように mode で指定されます。

O_BINARY

このパイプはバイナリモードで開かれます。

O_TEXT

このパイプはテキストモードで開かれます。



モードが 0 の場合,変換モードは外部変数 _fmode によって決定されます。

戻り値

成功した場合,_pipe は 0 を返し,handles[0] と handles[1] にパイプハンドルを返します。

エラーが発生した場合は -1 を返し,errno に次のいずれかの値を設定します。

EMFILE

オープンファイルが多すぎる

ENOMEM

メモリが足りない





 /*
  2 つの短いプログラムを示します。SEND は子プロセス
  RECEIVE を生成します。各プロセスはパイプの一端を
  保持します。親は自分のコマンドライン引数を子に送信し,
  子はその文字列を出力して終了します。
  重要:親プロセスは,\32bit\fileinfo.obj ファイルに
  リンクする必要があります。fileinfo 内のコードは,
  親が子とハンドルを共有するために必要です。
  この追加情報がないと,子は受け取った
  ハンドルを使用できません。
 */
 /* SEND */
 #include <fcntl.h>            // _pipe()
 #include <io.h>            // write()
 #include <process.h>          // spawnl() cwait()
 #include <stdio.h>          // puts() perror()
 #include <stdlib.h>          // itoa()
 #include <string.h>          // strlen()
 #define DECIMAL_RADIX 10      // atoi() 用
 enum PIPE_HANDLES { IN, OUT };  // ハンドルの配列のインデックス
 int main(int argc, char *argv[])
 {
   int handles[2];           // 入力および
 //出力パイプハンドル
   char handleStr[10];        // ハンドルは
 //文字列として格納されます
   int pid;
   // 子プロセスのシステムの ID
   if (argc <= 1)
   {
     puts("No message to send.");
     return(1);
   }
   if (_pipe(handles, 256, O_TEXT) != 0)
   {
     perror("Cannot create the pipe");
     return(1);
   }
   // ハンドルをコマンドラインに渡す文字列として格納します
   itoa(handles[IN], handleStr, DECIMAL_RADIX);
   // 子プロセスを作成し,それに入力パイプハンドルを渡します
      spawnl(P_NOWAIT, "receive.exe", "receive.exe", handleStr, NULL);
   // メッセージを送信します
   write(handles[OUT], argv[1], strlen(argv[1])+1);
   // パイプを使用し終わったら,両方のハンドルを閉じます
   close(handles[IN]);
   close(handles[OUT]);
   // 子の終了を待ちます
   wait(NULL);
   return(0);
 }



移植性



POSIX Win32 ANSI C ANSI C++

+