我正在尝试学习如何使用C语言中的pipe()命令,并尝试创建一个测试程序来复制在Linux终端输入ls | grep ".c"
时的功能。如果我在终端中输入这个命令,我只会得到test.c
作为结果。
我的代码如下:
#include "stdio.h"
#include "stdlib.h"
#include "unistd.h"
#include "fcntl.h"
int main(int argc, char** argv)
{
int pipefd[2];
int childpid,childpid2;
char* cmd[3]={"ls",NULL,NULL};
char* cmd2[3]={"grep",".c",NULL};
pipe(pipefd);
if(childpid=fork()){
//parent
}else{
//child
//write
close(pipefd[0]);
dup2(pipefd[1],STDOUT_FILENO);
execvp("ls", cmd);
}
if(childpid2=fork()){
}
else{
close(pipefd[1]);
dup2(pipefd[0],STDIN_FILENO);
execvp("grep",cmd2);
}
close(pipefd[0]);
close(pipefd[1]);
return 0;
}
这段代码会返回以下结果($是终端提示符):
$a.out
$test.c
(blank line)
程序没有完成,但是一直挂起直到我退出。我有什么问题?如何模拟终端?我是C语言新手,正在使用一个预先制作的程序模板,如果有明显的错误,请原谅。
test.c
以外,你的目录中还有哪些文件 - 你是否期望输出多行? - Floris