В настоящее время я пишу программу, которая создает дочерний процесс, используя fork(). Этот дочерний процесс должен выполнить команду оболочки «uniq» с опцией «-d», чтобы она читала из stdin. После команды execute я хочу отправить строки как stdin над каналом для программы «uniq». Поэтому после того, как я отправил одну и ту же строку за друг другом, строка должна быть напечатана на stdout (см. uniq
man-страница: https://linux.die.net/man/1/uniq). Но ничего не печатается.Почему дочерний процесс выполняет uniq -d не печатать дубликаты, переданные по протоколу stdin?
Вот мой код до сих пор:
void execute_uniq_process()
{
//create pipe
int pipefd[2];
if(pipe(pipefd)<0)
{
//error handling
}
//create argv for command:
char *argv[] = {"uniq","-d",(char *)0};
//create child process
pid_t pid = fork();
int status;
switch(pid)
{
case -1:
//error handling
break;
case 0:
//child process
//close writing end in pipe
close(pipefd[1]);
//duplicate stdin
dup2(pipefd[0],STDIN_FILENO);
close(pipefd[0]);
execvp("uniq",argv);
exit(errno);
break;
default:
//parent process
//close reading end in pipe
close(pipefd[0]);
//write all commands to pipe
write(pipefd[1],"test1",5);
write(pipefd[1],"test1",5);
write(pipefd[1],"test2",5);
//edited:
close(pipefd[1]);
//waits till child is finished
wait(&status);
if(WEXITSTATUS(status) != EXIT_SUCCESS)
{
//error handling
}
break;
}
}
Так что я бы ожидать, что печатается «test1» в оболочке. Я также удивляюсь, как закончить процесс uniq
. Я думаю, что может возникнуть проблема с написанием, поэтому мне нужно смоделировать «ввод» после каждой строки, которую я пишу в трубе.
Вы должны закрыть трубку, прежде чем ждать завершения 'uniq', потому что она не будет знать, что у нее есть EOF, пока вы не закроете трубку. И вы не указали ни одной строки на стандартный ввод 'uniq'. Системный вызов 'write()' записывает то, что вы говорите, чтобы писать, и, конечно же, не добавляет никаких новых строк по своему собственному желанию. –
Спасибо. Я отредактировал свой пост и закрыл трубку, прежде чем подождать uniq-процесса. Теперь он завершается. Но до сих пор я не понимаю, почему ничего не написано для stdin uniq. Читаемый конец ребенка был направлен на stdin. И родитель пишет в трубе. Извините за вопрос, я новичок в этой теме. – hiaslosch17
Вы не написали целую строку ввода 'uniq'; в том, что вы пишете, нет новых строк, поэтому нет дублирования ('uniq' видит' test1test1test2' без новой строки). См. Мой ответ. –