Share via


_popen、_wpopen

更新 : 2007 年 11 月

パイプを作成してコマンドを実行します。

FILE *_popen(
   const char *command,
   const char *mode 
);
FILE *_wpopen(
   const wchar_t *command,
   const wchar_t *mode 
);

パラメータ

  • command
    実行するコマンド。

  • mode
    返されるストリームのモード。

戻り値

作成されたパイプの一端に結合されたストリームを返します。パイプのもう一方の終端は、実行するコマンドの標準入力ストリームまたは標準出力ストリームに結合されます。エラーが発生した場合は、NULL を返します。command または mode が null ポインタの場合、または mode が有効なモードではない場合、errnoEINVAL に設定されます。有効なモードについては、「解説」を参照してください。

エラー コードの詳細については、「_doserrno、errno、_sys_errlist、および _sys_nerr」を参照してください。

解説

_popen 関数は、パイプを作成し、command 文字列で指定されているコマンド プロセッサのコピーを非同期に実行します。mode 文字列には、必要なアクセス モードを次の文字で指定します。

  • "r"
    呼び出しプロセスは、返されたストリームを使用して、呼び出されたコマンドの標準出力を読み取ることができます。

  • "w"
    呼び出しプロセスは、返されたストリームを使用して、呼び出されたコマンドの標準入力に書き込むことができます。

  • "b"
    バイナリ モードで開きます。

  • "t"
    テキスト モードで開きます。

    96ayss4b.alert_note(ja-jp,VS.90).gifメモ :

    _popen 関数を Windows プログラムで使用すると無効なファイル ポインタを返すため、プログラムが無期限に応答を停止する原因になります。_popen は、コンソール アプリケーションでは正しく動作します。入出力をリダイレクトする Windows アプリケーションの作成方法については、Windows SDK の「Creating a Child Process with Redirected Input and Output」を参照してください。

ワイド文字を扱う場合は、_popen 関数ではなく _wpopen 関数を使用します。_wpopen 関数の場合、path 引数にはワイド文字列を指定します。引数の指定以外では、_wpopen 関数と _popen 関数の動作は同じです。

汎用テキスト ルーチンのマップ

Tchar.h のルーチン

_UNICODE および _MBCS が未定義の場合

_MBCS が定義されている場合

_UNICODE が定義されている場合

_tpopen

_popen

_popen

_wpopen

必要条件

ルーチン

必須ヘッダー

_popen

<stdio.h>

_wpopen

<stdio.h> または <wchar.h>

互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。

ライブラリ

C ランタイム ライブラリのすべてのバージョン。

使用例

// crt_popen.c
/* This program uses _popen and _pclose to receive a 
 * stream of text from a system process.
 */

#include <stdio.h>
#include <stdlib.h>

int main( void )
{

   char   psBuffer[128];
   FILE   *pPipe;

        /* Run DIR so that it writes its output to a pipe. Open this
         * pipe with read text attribute so that we can read it 
         * like a text file. 
         */

   if( (pPipe = _popen( "dir *.c /on /p", "rt" )) == NULL )
      exit( 1 );

   /* Read pipe until end of file, or an error occurs. */

   while(fgets(psBuffer, 128, pPipe))
   {
      printf(psBuffer);
   }


   /* Close pipe and print return value of pPipe. */
   if (feof( pPipe))
   {
     printf( "\nProcess returned %d\n", _pclose( pPipe ) );
   }
   else
   {
     printf( "Error: Failed to read the pipe to the end.\n");
   }
}

出力例

現在のディレクトリに、拡張子が .c のファイルが 1 つしかない場合、次のように出力されます。

 Volume in drive C is CDRIVE
 Volume Serial Number is 0E17-1702

 Directory of D:\proj\console\test1

07/17/98  07:26p                   780 popen.c
               1 File(s)            780 bytes
                             86,597,632 bytes free

Process returned 0

.NET Framework の相当するアイテム

適用できません。標準 C 関数を呼び出すには、PInvoke を使用します。詳細については、「プラットフォーム呼び出しの例」を参照してください。

参照

参照

プロセス制御と環境制御

_pclose

_pipe