【发布时间】:2014-03-03 05:58:26
【问题描述】:
我正在尝试将标准输入更改为管道出口并将标准输出更改为另一个文件并使用 grep。我收到以下错误:
grep: (standard input): Bad file descriptor
我的代码是:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
int main()
{
pid_t childpid;
int fds[2];
int stat;
int fd = open("temp", O_WRONLY | O_APPEND);
int old_in = dup(STDIN_FILENO);
int old_out = dup(STDOUT_FILENO);
if ((childpid = fork()) != 0)
{
wait(&stat);
close(fds[1]);
dup2(fds[0], STDIN_FILENO);
dup2(fd, STDOUT_FILENO);
system("grep hello");
dup2(old_in, STDIN_FILENO);
dup2(old_out, STDOUT_FILENO);
close(fds[0]);
close(fd);
}
else if (childpid == 0)
{
close(fds[0]);
write(fds[1], "hello how are you", 100);
close(fds[1]);
return 0;
}
else
{
fprintf(stderr, "ERROR:\n");
exit(1);
}
return 0;
}
所以基本上我正在将一个字符串写入管道的写入出口,并使用管道的另一个出口(读取)作为 grep 的标准输入,并将标准输出输出到另一个文件。我已经从 childpid 中删除了返回,并尝试使用另一个文件作为标准输入,但仍然得到相同的错误。
【问题讨论】:
-
在
fork之后的子分支中使用execvp而不是system。阅读Advanced Linux Programming -
您似乎从未设置过
fds的值(例如,通过调用pipe(fds)。)此外,您确实应该检查系统调用的返回码,即使您没有'不要认为他们会失败。