sort:stat failed: - :错误的文件描述符

时间:2017-04-13 12:35:52

标签: c pipe

我试图实现一个模拟以下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"); 

  }

提前致谢,如果帖子结构不正确,我很抱歉,这是我的第一篇帖子。 :)

1 个答案:

答案 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