_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 を返します。 無効なパラメーターが原因でエラーが発生した場合、errnoEINVAL に設定されます。 有効なモードについては、「解説」を参照してください。

これらのエラー コードおよびその他のエラー コードの詳細については、「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

関連項目

プロセスと環境の制御
_pclose
_pipe