私の目的は、FIFO を介して子と親の間で IPC を作成することです。子供は走ればいい
execl ("/bin/cat", "cat", "/etc/passwd", (char *)0);
出力を親の入力にリダイレクトし、親は次のコマンドを実行する必要があります。
cut -l : -f 1
これをコマンドラインに出力します。
現在、FIFO を正常にリンクし、子プロセスの出力を親プロセスの入力にリダイレクトしました。複数のテストを行ったところ、その接続は正しく機能しています。問題は、カットの execl にあり、次のようになります。
execlp("/bin/cut", "cut", "-l:", "-f", "1", NULL);
しかし、そうではないことは確かです。
int cut(){
//
int myfifo;
char buf[MAX_BUF];
printf("\nCut opening FIFO");
if((myfifo = open("/tmp/myfifo", O_RDONLY | O_TRUNC))<0){
perror("open FIFO at cut");
quit(EXIT_FAILURE);}
else{printf("\nCut has FIFO opened and is reading\n");}
//read(myfifo, buf, MAX_BUF); outputting buf goes as supposed to
if( dup2(myfifo, 0) < 0 ){
perror("dup2 at cut");
quit(EXIT_FAILURE);}
//read(STDIN_FILENO, buf, MAX_BUF);
close(myfifo);
execlp("/bin/cut", "cut", "-l:", "-f", "1", NULL);
//this is for testing buf, but i guess the program shouldn't even get here
printf("\nCut has received: %s\nAnd is closing FIFO", buf);
return -1;
}
int cat(){
int myfifo;
//OPEN FIFO
printf("\nCat opening FIFO");
if( (myfifo = open("/tmp/myfifo", O_WRONLY | O_TRUNC) )<0){
perror("open FIFO at cat");
quit(EXIT_FAILURE);
}
else{
printf("\nCat has opened FIFO");
//WRITE OUTPUT OF "cat \etc\passwd" TO FIFO
dup2(myfifo, 1);
execl ("/bin/cat", "cat", "/etc/passwd", (char *)0);
}
close(myfifo);
return 0;
}
main は現在、fifo (mkfifo)、forks() を作成し、関数を呼び出すだけです。私の問題は、親の stdin (running cut) にある可能性がありますが、そうは思わないか、または execl() が stdin から直接読み取ると想定していて、そうではありません。execl() を介して「カット」を適切に記述していないためだと思います。
コードの修正、またはいくつかのアイデアを表現した方法でさえ、私が何かを正しく理解していないことを示している可能性があるため、非常に高く評価されます。助けてくれてありがとう