Я пытаюсь использовать execvp
для запуска grep
. Мысль, стоящая за этой программой, заключается в том, чтобы развить дочерний процесс, сделать дочерний файл sort
файлом с именем sortfile, тогда родительский процесс должен использовать grep
на отсортированном выходе. Ниже мой код.Grep никогда не возвращается
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#define READ 0
#define WRITE 1
int main(int argc, char* argv) {
pid_t cpid;
int status;
int pipefd[2];
pipe(pipefd);
char* args[] = {"grep", "f", NULL};
cpid = fork();
if(cpid == 0) {
dup2(pipefd[READ], READ);
dup2(pipefd[WRITE], WRITE);
close(pipefd[READ]);
close(pipefd[WRITE]);
if(execlp("sort", "sort", "sortfile", NULL) == -1) {
perror("sort");
}
} else {
dup2(pipefd[READ], READ);
dup2(pipefd[WRITE], WRITE);
close(pipefd[READ]);
close(pipefd[WRITE]);
wait(&status);
if(execvp("grep", args) == -1) {
perror("grep");
}
}
}
Я использую dup2, чтобы скопировать файл дескрипторы трубы стандартного ввод и стандартный вывод, а затем закрыть неиспользуемые дескрипторы файлов. Даже при этом программа никогда не возвращается, что заставляет меня поверить, что она пытается читать из дескриптора файла, который не записывается, тем самым блокируя процесс. Я полностью потерял это и мог использовать некоторые намеки. Содержимое sortfile равно a b f s g
.
Боже, я даже об этом не думал. Я исправил «dup2» звонки, и он работает. Если вы опубликуете его в качестве ответа, я соглашусь с ним. –