_popen、_wpopen
パイプを作成し、コマンドを実行します。
重要
この API は、Windows ランタイムで実行するアプリケーションでは使用できません。詳細については、「/ZW でサポートされない CRT 関数」を参照してください。
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 有効なモードでない場合など、エラーが無効なパラメーターである場合は、errno は EINVAL に設定されます。 有効なモードについては、「解説」を参照してください。
エラー コードの詳細については、「_doserrno、errno、_sys_errlist、および _sys_nerr」を参照してください。
解説
_popen 関数はパイプを作成し、非同期的に指定の文字列 command でコマンド プロセッサの開始されたコピーを実行します。 mode 文字列では、次のように、要求するアクセスの種類を指定します。
"r"
呼び出しプロセスは、返されたストリームを使用して、開始されたコマンドの標準出力を読み取ることができます。"w"
呼び出しプロセスは、返されたストリームを使用して、開始されたコマンドの標準入力に書き込むことができます。"b"
バイナリ モードで開きます。"t"
テキスト モードで開きます。注意
Windows プログラムで使用すると、_popen 関数は無効なファイル ポインターを返し、その結果、プログラムは無期限に応答を停止します。_popen は、コンソール アプリケーションで正しく動作します。入力と出力をリダイレクトする Windows アプリケーションを作成するには、Windows SDK の「リダイレクトされた入出力を持つ子プロセスの作成」を参照してください。
_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 ランタイム ライブラリのすべてのバージョン。
使用例
// 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 を使用します。詳細については、「プラットフォーム呼び出しの例」を参照してください。