【发布时间】:2014-01-22 16:54:19
【问题描述】:
我 fork 并设置这样的命令:
pid_t pid;
pid = fork();
if (pid == 0)
{ // I am the child
freopen("/input_pipe","r",stdin);
freopen("/output_pip","w",stdout);
execl("/bin/sh", "sh", "-c", command, (char *)NULL); // using execv is probably faster
// Should never get here
perror("execl");
exit(1);
}
/input_pipe 在进程分叉之前已创建并填充了数据。
这几乎在所有情况下都可以正常工作。该命令从其标准输入读取(使用read())并获取另一个进程写入管道的数据。
但有时该命令无法从其标准输入流中读取,并在尝试这样做时得到“错误的文件描述符”错误。
什么可能导致这个错误?
编辑:我已将 freopen 部分更改为:
pipe_in = open(pipename_in, O_RDONLY);
pipe_out = open(pipename_out, O_WRONLY);
dup2(pipe_in, 0);
dup2(pipe_out, 1);
我会测试几天,因为错误只是很少出现。
【问题讨论】:
-
您的“真实”代码是否通过针对
NULL测试函数返回值来检查freopen()是否有错误?