【问题标题】:Execvp Hangs when output is too large?当输出太大时,Execvp 挂起?
【发布时间】:2018-12-04 21:13:07
【问题描述】:

所以我有一个远程 shell 程序。当输出不是那么大时它可以正常工作,但是当我从命令中获取大量输出时它会挂起。

这是一段代码。我可以确认 args 按预期工作。例如,如果 args[0] = "ps" 和 args=["ps", "-ael" , NULL]。父级将卡在 wait() 上。孩子卡在 execvp() 上。但是,如果 args 只是 ["ps", "-a", NULL],则输出较少,它不会卡在 wait() 上。

我应该注意到这是它在 Mac 上的作用。在 Linux 系统上崩溃并显示 free(): invalid next size (normal)。

 ...
if (fork() == 0) {
          printf("fork %s\n", "  ");
          close(STDOUT_FILENO);
          close(fds[0]);
          dup2(fds[1], STDOUT_FILENO);
          dup2(fds[0], STDIN_FILENO);
          dup2(errorPipe[1], STDERR_FILENO);
          close(fds[1]);
          fflush(stdout);

          if(0 < execvp(args[0], args)) {
               perror("execvp failed");
               printf("Command Failed! \n");
          }
      }

      printf("%s\n", "waiting");
      wait(0);
      printf("%s\n", "done waiting");
      char errorMessage[3000];
      read(fds[0], msg, command->messageSize);
      printf("msg %s\n", msg);
       ....

【问题讨论】:

    标签: c concurrency


    【解决方案1】:

    子进程正在等待您读取一些数据,然后再写入更多数据。内核不会为您记住所有数据,只会记住有限的数量。

    您没有读取任何数据,因为您正在等待它完成。但在您读取数据之前它不会完成。

     

    free(): invalid next size (normal) 是一个完全不同的问题 - 这意味着您正在覆盖一些您不应该覆盖的内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-02
      • 2015-10-16
      • 2021-12-07
      • 1970-01-01
      • 2014-10-23
      • 2012-09-18
      • 2016-03-04
      相关资源
      最近更新 更多