我试图实现一个模拟以下shell命令行的C程序:
find . -type f -ls | cut -d " " -f 3- | sort -n -k 6 >file.txt ; less <file.txt
我对流程,管道和套接字都很陌生,在尝试了几个实现并尝试寻找问题的解决方案后,我确信我还没有足够的技能来理解我自己的错误。 有人可以解释一下我在这里做错了什么吗?当我尝试执行代码时,我收到错误:
sort: stat failed: -: Bad file descriptor.
这里是与sort命令关联的子函数:
// child 3 (sort)
void child3(int *pipe_fd)
{
int fdo;
// fecha parte do write do pipe
if (close(pipe_fd[1]) == -1) erro("child 3-> failed to close pipe[1] (pipe_fd)");
// alteração std_in ler do pipe
if(dup2(pipe_fd[0], 0) == -1) erro("child 3 -> failed to dup2 (pipe_fd)" );
// "fechar o file descriptor do pipe" pois já o redirecionamos
if(close(pipe_fd[0]) == -1) erro("child 3 -> failed to close pipe[0]");
// criação do file.txt com direitos de escrita e leitura
if (fdo=open("file.txt", O_CREAT|O_WRONLY, 0600) == -1)
erro("child_3 failed to open/create 'file.txt'");
// redirecionamento do stdout para o sort
if(dup2(fdo, 1) == -1) erro("child 3 -> failed to dup2 (fdo)");
// fecho do file descriptor criado no open
if(close(fdo) == -1 ) erro("child 3 -> failed to close pipe[1]");
// executa o sort
if (execlp("sort", "sort", "-n", "-k", "6",NULL) == -1)
erro("child_3 failed to execlp");
}
提前致谢,如果帖子结构不正确,我很抱歉,这是我的第一篇帖子。 :)
答案 0 :(得分:3)
错误相当简单,如果您使用gcc -Wall
编译,则会收到警告:
warning: suggest parentheses around assignment used as truth value [-Wparentheses] if (fdo=open("file.txt", O_CREAT|O_WRONLY, 0600) == -1) { ^~
这表明要将赋值表达式括起来。并且正确的包围应该是
if ((fdo = open("file.txt", O_CREAT|O_WRONLY, 0600)) == -1) {
如果没有括号,==
的优先级高于=
的优先级,因此表达式被解析为
if (fdo = (open("file.txt", O_CREAT|O_WRONLY, 0600) == -1 )) {
如果fdo
成功,则0
将设置为open
,如果失败,1
将设置为fdo
。在此处成功,0
将为if (close(fdo) == -1)
并且行
0
最终将关闭描述符sort
,该描述符应该是sort
的标准输入,因此fstat(0, ...)
会抱怨EBADF
返回docker stats
。