1
我試圖使用execvp
來運行grep
。這一計劃背後的思想是fork一個子進程,使孩子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'調用,它正在工作。如果您將其作爲答案發布,我會接受它。 –