c管道破裂的原因

时间:2014-03-03 01:06:25

标签: c pipe

我正在使用fork和execlp在c中构建一个简单的shell。我将获得一组由管道分隔的命令。例如:ls -l | wc -l。我试图在c中实现一个简单的shell程序。由于一些奇怪的原因,我收到了管道错误。

void excueteCommand(commandNode* head, int input) {

    int pfds[2] = { -1, -1 };

    if (head->next != NULL) {

        pipe(pfds);
    }

    if (fork() == 0) { /* child */

        if (input != -1) {

            dup2(input, 0);
            close(input);
        }

        if (pfds[1] != -1) {

            dup2(pfds[1], 1);
            close(pfds[1]);
        }

        if (pfds[0] != -1) {

            close(pfds[0]);
        }

        execlp(head->command, head->args, NULL);
        exit(1);
    }

    else { /* parent */

        if (input != -1) {
            close(input);
        }

        if (pfds[1] != -1) {
            close(pfds[1]);
        }

        if (head->next != NULL) {

            thePipenizer(head->next, pfds[0]);
        }
    }
}

2 个答案:

答案 0 :(得分:0)

嗨,我不知道索引是什么。我做了一个简单的编程,可以向你展示你犯的一些错误。

int main()
{
  int   pfds[2] = { -1, -1 };
  int   input;
  char  *argvv = "";
  char  *tab = malloc(500);
  int   i;
  int   nbRead;
  int   stat;

  input = dup(0);
  if (pipe(pfds) == -1)
     exit(-1);
  if (fork() == 0)
    { /* child */
      dup2(pfds[1], 1);
      close(pfds[0]);
      execlp("ls", argvv, NULL);
      exit(-1);
    }
  else
    { /* parent */
      close(pfds[1]);
      wait(&stat);
      do
        {
          nbRead = read(pfds[0], tab, 500);
          for (i = 0; i < nbRead; i++)
            printf("%c", tab[i]);
        } while (nbRead > 0);
      close(pfds[0]);
    }
  return (0);
}

首先:不要考虑pfds [0]和pfds [1]值,而是查看函数管道的返回值。如果出现错误,函数管道返回-1(参见man pipe)。

第二:不要忘记关闭所有打开的fd,这对系统很重要。

如果你能告诉我们更多关于

的信息
  

输入

也许我们可以找到你的问题。

答案 1 :(得分:0)

在父级中,尝试重置pfds。那就是:

if( pfds[1] != -1 ) {
    close( pfds[1] );
    pfds[1] = -1;   /* Add this line */
}

通过将其设置为先前的值,后续子项很可能正在关闭您不希望它们关闭的文件描述符。