-2

popen を使用する利点は、コマンドによって生成された出力を読み取ることだけです。または、システムに対する popen の利点または利点が他にもいくつかあります。

以下の 2 つのプログラムを検討してください。

プログラム 1:

#include <stdio.h>

int main()
{
    FILE *more,*who;

    if (!(more = popen("more", "w")))
    {
            printf("Command `more` not found!");
            return -1;
    }
    if (!(who = popen("who", "r")))
    {
            printf("Command `who` not found!");
            return -1;
    }

    while (!feof(who))
    {
            char buffer[100];
            if (fgets(buffer, 100, who) != NULL)
            {
                    fputs(buffer, more);
            }
    }

    fclose(more);
    fclose(who);
  return 0;
 }

プログラム 2:

#include <unistd.h>
int main()
{
    system("who|more");
    return 0;
}

Program2で行ったのと同じことを 1 行で実行できるのに、なぜProgram1を使用する必要があるのでしょうか。

4

1 に答える 1

4

例として提供した 2 つのプログラムは同等ではありません。 popenインタラクティブな方法で実行中のプロセスの stdin/stdout との間で入力と出力を読み書きするために使用できるファイル ハンドルのペアを提供します。呼び出しは単にそれsystemを実行し、現在のプロセスの stdin を呼び出された子プロセスの stdin にリダイレクトし、そのプロセスの stdout を現在の (ホスト) プロセスの stdout にリダイレクトするだけです。

一般に、何を達成しようとしているかによって異なります。単にコマンドを実行することが目的の場合は、問題なく動作しsystemます。その出力をプログラム的に読み取って処理する (さらに多くの入力を生成する) ことに関心がある場合は、popenより適切に機能します。

于 2013-05-07T05:56:06.720 に答える