助けてくれてありがとう。
ls -1 /usr/include | more
Cプログラムを使用してシェルコマンドの動作を再現しようとしています。私はこのコードを書きました:
#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]
コメントを追加