作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试使用 execvp
来运行 grep
。这个程序背后的想法是 fork 一个子进程,让子进程 sort
一个名为 sortfile 的文件,然后父进程应对排序后的输出使用 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 将管道的文件描述符复制到标准输入和标准输出,然后关闭未使用的文件描述符。即使这样做程序也永远不会返回,这让我相信它正在尝试从一个没有被写入的文件描述符中读取,从而阻塞了进程。我完全迷失了这一点,可以使用一些提示。排序文件的内容是a b f s g
。
最佳答案
父级和子级的 dup2
调用是相同的。那是不对的。子(排序)需要写入父(grep)从中读取的管道。
关于c - Grep 永不返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33847531/
我是一名优秀的程序员,十分优秀!