c - 当输出太大时,Execvp 挂起?
问题描述
所以我有一个远程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);
....
解决方案
子进程正在等待您读取一些数据,然后再写入更多数据。内核不会为您记住所有数据,只会记住有限的数量。
您没有读取任何数据,因为您正在等待它完成。但在您读取数据之前它不会完成。
free(): invalid next size (normal)
是一个完全不同的问题——这意味着你正在覆盖一些你不应该覆盖的内存。
推荐阅读
- docker - 如何获取 docker 镜像中使用的用户 uid 和名称
- symfony - 为什么 Symfony 生成带有内核名称的路由?
- php - 在 ajax 调用中传递图像并使用 php 读取
- powerbi - 基于两列 DAX 汇总值
- lightgbm - LIghtGBM 的 SHAP 汇总图
- php - 如何在 Laravel 验证中要求数组并防止获得意外的键
- javascript - 基于使用 JavaScript 的 Viewbag 的值在 MVC 表单上显示或隐藏字段
- node.js - 无法在节点js中获取变量值
- flutter - flutter-我可以在应用程序树中实现 BlocProvider 而不是在 runApp 中实现吗?
- javascript - '$eq' 不适用于 mongodb 中日期中的数组