_popen
, _wpopen
パイプを作成し、コマンドを実行します。
重要
この API は、Windows ランタイムで実行するアプリケーションでは使用できません。 詳細については、「ユニバーサル Windows プラットフォーム アプリでサポートされていない CRT 関数」を参照してください。
構文
FILE *_popen(
const char *command,
const char *mode
);
FILE *_wpopen(
const wchar_t *command,
const wchar_t *mode
);
パラメーター
command
実行するコマンド。
mode
返されるストリームのモード。
戻り値
作成されたパイプの一方の端に関連付けられているストリームを返します。 パイプのもう一方の端は、開始されたコマンドの標準入力または標準出力に関連付けられます。 エラー発生時には、関数は NULL
を返します。 無効なパラメーターが原因でエラーが発生した場合、errno
は EINVAL
に設定されます。 有効なモードについては、「解説」を参照してください。
これらのエラー コードおよびその他のエラー コードの詳細については、「errno
、_doserrno
、_sys_errlist
、_sys_nerr
」を参照してください。
解説
_popen
関数では、パイプが作成されます。 次に、コマンド プロセッサの生成されたコピーを非同期的に実行し、コマンド ラインとして command
を使用します。 文字列 mode
では、次のように、要求するアクセスの種類を指定します。
アクセス モード | 説明 |
---|---|
"r " |
呼び出しプロセスは、返されたストリームを使用して、開始されたコマンドの標準出力を読み取ることができます。 |
"w " |
呼び出しプロセスは、返されたストリームを使用して、開始されたコマンドの標準入力に書き込むことができます。 |
"b " |
バイナリ モードで開きます。 |
"t " |
テキスト モードで開きます。 |
Note
Windows プログラムで使用すると、_popen
関数は無効なファイル ポインターを返し、その結果、プログラムは無期限に応答を停止します。 _popen
は、コンソール アプリケーションで正しく動作します。 入力と出力をリダイレクトする Windows アプリケーションを作成するには、Windows SDK の「 リダイレクトされた入力と出力を使用した子プロセスの作成 を参照してください。
_wpopen
関数は、 _popen
関数のワイド文字バージョンです。 path
関数の引数 _wpopen
は、ワイド文字列です。 それ以外では、_wpopen
と _popen
の動作は同じです。
既定では、この関数のグローバル状態の適用対象は、アプリケーションになります。 この動作を変更するには、「CRT でのグローバル状態」を参照してください。
汎用テキスト ルーチンのマップ
Tchar.h ルーチン |
_UNICODE と _MBCS が定義されていない |
_MBCS が定義されている |
_UNICODE が定義されている |
---|---|---|---|
_tpopen |
_popen |
_popen |
_wpopen |
要件
ルーチンによって返される値 | 必須ヘッダー |
---|---|
_popen |
<stdio.h> |
_wpopen |
<stdio.h> または <wchar.h> |
互換性の詳細については、「 Compatibility」を参照してください。
ライブラリ
C ランタイム ライブラリのすべてのバージョン。
例
// 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))
{
puts(psBuffer);
}
int endOfFileVal = feof(pPipe);
int closeReturnVal = _pclose(pPipe);
if (endOfFileVal)
{
printf("\nProcess returned %d\n", closeReturnVal);
}
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