Моя цель - сделать IPC между дочерним и родительским с помощью FIFO. Ребенок должен работатьКак запустить мой stdin через команду cut с помощью функции execl()?
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;
}
Основное в настоящее время создает только функции fifo (mkfifo), forks() и вызывает функцию. Моя проблема может возникнуть с помощью stdin родителя (run cut), но я так не думаю, или, может быть, я предполагаю, что execl() читает непосредственно из stdin, и это не так. Я думаю, что это действительно так, потому что я не пишу «вырезать» через execl() правильно.
Любые поправки к коду, или даже то, как я выразил некоторые идеи, может указывать на то, что я не понимаю что-то должным образом, был бы очень признателен. Благодарим за помощь
Почему вы используете FIFO или именованный канал вместо нормального, обычного, анонимного канала? –
Какая версия 'cut' поддерживает опцию' -l'? Ни GNU 'cut', ни BSD (Mac OS X)' cut' не делает. Кажется, вы используете его как эквивалент опции -d' (разделитель полей), что имеет смысл для чтения файла паролей. Кроме того, 'cut' в'/bin' на вашем компьютере? Он находится в '/ usr/bin' на моем, и два каталога отличаются друг от друга. –