【发布时间】:2014-11-03 04:45:42
【问题描述】:
我正在尝试实现以下简单的 UNIX 命令:
cat -n < file.txt
其中 file.txt 仅包含一个整数“5”。
我对输出重定向很好,但是这个输入重定向让我很难过。这是我模拟上述命令的尝试:
int f_des[2];
char *three[]={"cat", "-n", NULL};
// Open a pipe and report error if it fails
if (pipe(f_des)==-1){
perror("Pipe");
exit(1);
}
int filed=open("file.txt", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
//fork child
if(fork()==0){
dup2(f_des[1], filed);
close(f_des[0]);
}
//fork child
if(fork()==0){
dup2(f_des[0], fileno(stdin));
close(f_des[1]);
execvp(three[0], three);
}
我收到以下错误:
cat: -: Input/output error
我的想法是我通过管道发送filed(文件的fd),管道的另一端将从管道收集文件的内容作为标准输入,然后我将执行“cat -n”文件的内容位于标准输入中。
【问题讨论】:
-
为什么要以输出模式打开文件?为什么要调用 fork() 三次(第二次将在第一次的父子级中运行)。
-
我认为您应该以读取模式打开文件。你在哪里使用变量“三”?
-
所以代码是正确的,只是我需要以不同的方式打开文件?如果是这样,我应该在 open() 中使用什么标志。啊,对不起,我是想在close(f_des[0]);之后退出进程;
-
我将 WRONLY 更改为 RDONLY,并在 close(f_des[0]) 后退出(),但现在它在更正后完全没有输出:S
标签: c unix pipe file-descriptor