【転載】popenの使い方

3319 ワード

転載先:https://blog.csdn.net/stone8761/article/details/77498439
 popen()はshellコマンドを実行し、このコマンドの戻り値を読み取ることができます.
 popen()関数は、パイプを作成し、fork()を呼び出してサブプロセスを生成し、shellを呼び出してコマンドを実行することによってプロセスを開きます.このパイプで標準入出力操作を実行できます.このパイプはpclose()関数で閉じる必要があり、pclose()関数で閉じる必要があり、fclose()関数ではなくpclose()関数で閉じる必要があります(fclose()関数を使用するとゾンビプロセスが発生します).pclose()関数は標準I/Oストリームを閉じ、コマンドの実行が終了するのを待ってshellの終了状態に戻ります.shellが実行できない場合、pclose()が返す終了状態はshellがexitを実行したのと同じです.
関数プロトタイプ
FILE *popen(const char *command, const char *type);
int pclose(FILE *stream);

  typeパラメータは、読み取りまたは書き込みのいずれかのみであり、得られる戻り値(標準I/Oストリーム)もtypeに対応する読み取り専用または書き込みのみのタイプを有する.typeがrの場合、ファイルポインタはcommandの標準出力に接続され、typeがwの場合、ファイルポインタはcommandの標準入力に接続される.
  commandパラメータは、NULLで終了したshellコマンド文字列を指すポインタです.このコマンドはbin/shに渡され、-cフラグが使用され、shellはこのコマンドを実行します.
  popen()の戻り値は標準I/Oストリームであり、pclose()で終了する必要があります.前述したように、このストリームは一方向(読み取りまたは書き込みのみ)であり、このストリームへの書き込み内容は、コマンドを書き込む標準入力に相当し、コマンドの標準出力とpopen()を呼び出すプロセスは同じである.これに対して、ストリームからデータを読み出すことは、コマンドの標準出力を読み取ることに相当し、コマンドの標準入力とpopen()を呼び出すプロセスは同じである.
戻り値
 fork()を呼び出す(サブプロセスを生成する)またはpipe()を呼び出す(パイプを申請する)ことに失敗した場合、またはメモリを割り当てることができない場合はNULLを返し、そうでない場合は標準I/Oストリームを返します.popen()はメモリの割り当てに失敗したerrno値を設定していません.fork()またはpipe()を呼び出すとエラーが発生し、errnoは対応するエラータイプに設定されます.typeパラメータが正当でない場合、errnoはEINVALを返します.
例:
#include 
#include 
#include 
#include 

void print_result(FILE *fp)
{
    char buf[100];

    if(!fp) {
        return;
    }
    printf("
>>>
"
); while(memset(buf, 0, sizeof(buf)), fgets(buf, sizeof(buf) - 1, fp) != 0 ) { printf("%s", buf); } printf("
<<); } int main(void) { FILE *fp = NULL; while(1) { fp = NULL; fp = popen("ls", "r"); if(!fp) { perror("popen"); exit(EXIT_FAILURE); } print_result(fp); pclose(fp); sleep(1); } }