Cプログラムは、プログラムの出力を表示するために、パイプを使用して「execlp」の「more」コマンドを実行することはできません。

デズモンド

助けてくれてありがとう。

ls -1 /usr/include | moreCプログラムを使用してシェルコマンドの動作を再現しようとしています。私はこのコードを書きました:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(){
    int page[2];   // page is the name of my pipe
    pipe(page);
    switch (fork()){
    case -1:
        exit(1);
        break;
    case 0:;
        close(page[1]);
        dup2(page[0], 0);
        close(page[0]);
        execlp("more", "more", NULL);
    default:
        close(page[0]);
        dup2(page[1], 1);
        close(page[1]);
        execlp("ls", "ls", "-1", "/usr/include", NULL);
        break;
    }
}

しかし、それは(moreそうするように)1ページしか印刷せず、端末をブロックする奇妙な動作を引き起こします(reset通常に戻すために使用する必要があります)。

デズモンド

親と子のプロセスが混同されていることに気づきました。moreコマンドを実行するのは親である必要があります。以来moreインタラクティブなコマンドは、端末は、親(私は推測している)として、より良い、それに対応させていただきます。

そこで、問題を解決するために、親と子の役割を切り替えました。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(){
    int page[2];   // page is the name of my pipe
    pipe(page);
    switch (fork()){
    case -1:
        exit(1);
        break;
    case 0:;
        close(page[0]);
        dup2(page[1], 1);
        close(page[1]);
        execlp("ls", "ls", "-1", "/usr/include", NULL);
        break;
    default:
        close(page[1]);
        dup2(page[0], 0);
        close(page[0]);
        execlp("more", "more", NULL);
    }
}

なぜこれが問題を解決するのですか?(なぜそれが機能したのかまだはっきりとはわかりません!)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ