_popen、_wpopen
パイプを作成してコマンドを実行します。
FILE *_popen(
const char *command,
const char *mode
);
FILE *_wpopen(
const wchar_t *command,
const wchar_t *mode
);
パラメーター
コマンド
実行するコマンド。モード
返されるストリームのモード。
戻り値
作成されたパイプの一端に結合されたストリームを返します。 パイプのもう一方の終端は、実行するコマンドの標準入力ストリームまたは標準出力ストリームに結合されます。 エラーが発生した場合は、NULL を返します。 command または mode が null ポインターの場合、または mode が有効なモードではない場合、errno は EINVAL に設定されます。 有効なモードについては、「解説」を参照してください。
エラー コードの詳細については、「_doserrno、errno、_sys_errlist、および _sys_nerr」を参照してください。
解説
_popen 関数は、パイプを作成し、command 文字列で指定されているコマンド プロセッサのコピーを非同期に実行します。 mode 文字列には、必要なアクセス モードを次の文字で指定します。
「r」
呼び出しプロセスは、返されたストリームを使用して、呼び出されたコマンドの標準出力を読み取ることができます。「w」
呼び出しプロセスは、返されたストリームを使用して、呼び出されたコマンドの標準入力に書き込むことができます。「b」
バイナリ モードで開きます。"t"
テキスト モードで開きます。注意
_popen 関数を Windows プログラムで使用すると無効なファイル ポインターを返すため、プログラムが無期限に応答を停止する原因になります。 _popen は、コンソール アプリケーションでは正しく動作します。 入出力をリダイレクトする Windows アプリケーションの作成方法については、Windows SDK の「Creating a Child Process with Redirected Input and Output」を参照してください。
_wpopen は _popen のワイド文字バージョンであり、_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 を使用します。詳細については、「プラットフォーム呼び出しの例」を参照してください。