当输出太大时,Execvp挂起?

时间:2018-12-04 21:13:08

标签: c concurrency

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

这是一段代码。我可以确认args可以正常工作。因此,例如,如果args [0] =“ ps”且args = [“ ps”,“ -ael”,NULL]。父级将卡在wait()上。子卡在execvp()上。但是,如果args只是[“ ps”,“-a”,NULL],则在输出较少的情况下,它不会卡在wait()上。

我应该注意,这就是Mac上的功能。在Linux系统上会崩溃并显示free():下一个大小无效(正常)。

 ...
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);
       ....

1 个答案:

答案 0 :(得分:1)

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

您没有读取任何数据,因为您正在等待数据完成。但这要等到您读取数据后才能结束。

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