问题标签 [pclose]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
144 浏览

c - 重新分配后的分段错误

这是我的代码:

当我执行代码时,我的程序崩溃了。输出是分段错误,在 pclose(fp) 命令之前。当我删除 realloc 程序运行良好。也许我对 realloc 做错了什么?

0 投票
1 回答
1619 浏览

c++ - C++ popen 管道没有正确关闭“ps aux”命令的 pclose

我正在运行 MacOS 并希望执行“ps aux”命令并通过我的应用程序获取其输出。我编写了一个使用 popen 函数执行命令的方法:

我有一个不断运行 exec("ps aux") 函数的循环。问题是来自 popen 的管道没有关闭,我已经使用终端中的“lsof”命令进行了检查。大约 20 秒后,应用程序打开了大约 300 个文件描述符,这阻止了应用程序从循环中打开更多管道(运行“ps aux”命令)。

我发现,exec 函数适用于其他命令(管道正确关闭),例如“netstat”,因此它必须是“ps aux”命令中阻止管道关闭的东西。

我已经搜索了很多关于该问题的信息,但没有找到任何解决方案。有人可以指出我正确的方向吗?

谢谢!

0 投票
1 回答
978 浏览

c - Pclose 似乎使进程失败

这个问题是这个问题的后续:Controlling a C daemon from another program

我的目标是控制另一个程序的守护进程执行。
守护进程的代码非常简单。

我已经为这个守护进程实现了一个 SystemV 初始化脚本,如下所示

从命令行使用这个脚本来控制守护进程的执行效果很好。


所以现在的目标是使用另一个 c 程序中的这个脚本来启动守护进程并从这个程序控制它的执行。

我已经实现了一个简单的 C 程序,它:

  1. 使用“开始”参数启动脚本
  2. 等待 pid 文件创建
  3. 从 pid 文件中读取守护进程的 pid
  4. 通过检查文件的存在来定期检查守护进程是否处于活动状态/proc/<daemon_pid>/exec
  5. 如果守护进程被杀死,请重新启动它

这是我面临的问题。该程序只有在我不调用时才能正常运行pclose

这是程序的代码

据我了解pclose,应该等待子进程终止,并且只有当子进程返回时,它才会关闭管道。

所以我不明白为什么我的实现在pclose不调用它的情况下不起作用。

pclose这是带有和不带注释块的日志

无需pclose调用:

调用pclose

如您所见,守护进程永远不会启动,pid 文件也永远不会创建。

即使我的程序在没有pclose我的情况下工作,我也想了解调用pclose.

当行为良好而不调用它时,为什么 usingpclose会使程序失败?


编辑:

以下是有关错误案例的更多信息

errno 是Success
WIFEXITED 宏返回 true
WEXITSTATUS 宏返回 141

通过进一步调试,我指出修改 init 脚本以将输出记录到文件使其工作......为什么?

0 投票
4 回答
1743 浏览

c++ - 在 pclose() 之前从 popen()ed FILE* 读取的输出是否完整?

pclose()的手册页说:

pclose() 函数等待相关进程终止并返回由 wait4(2) 返回的命令的退出状态。

我觉得这意味着如果用 type 打开关联的FILE*创建以读取的输出,那么直到调用. 但是在 之后,关闭肯定是无效的,那么你怎么能确定你已经阅读了整个输出呢?popen()"r"commandpclose()pclose()FILE*command

为了举例说明我的问题,请考虑以下代码:

我的问题,如上图所示:如果我们只是确定产生输出的子进程在 之后终止pclose(),我们怎么知道用 检索的内容fread()是完整的?但是,如果我们等到 , 之后pclose()fp无效的,那么我们就无法再从任何地方检索命令的输出了,对吧?

这感觉就像一个先有鸡还是先有蛋的问题,但我已经看到了与上面类似的代码,所以我可能误解了一些东西。我很感激对此的解释。

0 投票
1 回答
68 浏览

segmentation-fault - fscanf 后 pclose 时出现分段错误

我尝试获取丢失的数据包编号(来自覆盆子上的 ping 命令),用于在路由器上进行 sim 切换。我试图用底部的代码来做到这一点(减少到导致错误的部分),但是当我尝试释放(pclose)缓冲区时,我得到了分段错误。我试过 valgrind,我得到了这个:

在 0x490FBE0 读取大小为 4 的无效:fclose@@GLIBC_2.4 (iofclose.c:53) 地址 0x382e3820 未堆栈、malloc 或(最近)释放进程以信号 11(SIGSEGV)的默认操作终止访问不在地址 0x382E3820 的映射区域内

我想我错过了 fscanf 但我不知道如何(我得到 printf 结果并且它是正确的 - 4)。

0 投票
0 回答
45 浏览

c - Turbo C 库中不包含 popen、pclose 和 getdelim 函数

这个问题很直接......

管道函数(popen 和 pclose)和getdelim 函数不包含在我正在使用的Borland Turbo C 库中。

我无法编译任何涉及这些函数的代码。MinGw 的库在其stdio.h中包含这些函数,但是当我在计算机上使用它进行编译时,MinGw 崩溃。

那么,我可以制作单独的文件 popen.c、pclose.c 和 getdelim.c 并使用 Turbo C 上的主要代码编译它们吗?我应该如何定义和初始化这些函数?

我不知道这些函数的代码,所以任何代码都会很有帮助......

0 投票
0 回答
84 浏览

c - 为什么 pclose 过早返回?

更新 1:此问题已更新,以消除多线程,简化其范围。原来的问题popen在主线程中,pclose子进程在不同的线程中。通过在同一个(主)线程中执行popenand ,所询问的问题可以更简单地重现。pclose

更新 2:在如何检查 libc 版本的响应者的帮助下?,我想我已经确定正在使用的 libc 是 uClibc 0.9.30。

下面的代码popen是主线程中的一个脚本,稍等片刻,然后pclose是同一个主线程中的子进程。该程序针对多个交叉目标进行了交叉编译。

可执行文件的代码:

剧本:

预期的行为是编译的可执行文件在子进程中生成脚本的执行,等待其完成,然后退出。这在包括 x86、x64 和 ARM 在内的许多跨目标上都得到了满足。以下是满足预期行为的示例架构、编译和相应的日志:

汇编:

mybin.log:

myscript.log:

然而,在一个目标上,发生了一件奇怪的事情:pclose提前返回:在脚本开始运行之后,但在它完成运行之前很久——为什么?以下是观察到意外行为的问题架构、交叉编译器标志和相应的日志:

交叉编译:

mybin.log:

myscript.log:

我的问题的要点是:为什么pclose过早返回,为什么只在这个交叉目标上?

评论和研究让我认为这是变体/版本中的一个错误libc- 如果了解该主题的人可以帮助确认是否是这种情况,那就太好了。


不是pclose() 在多线程环境中过早返回的副本(Solaris 11)

0 投票
1 回答
61 浏览

c - 为什么这个 pclose() 实现会随着 ECHILD 提前返回,除非在 popen() 之后延迟调用?

我最近想弄明白如何 fork/exec 子进程并重定向 stdin、stdout 和 stderr,通过这些方法,我编写了自己的popen()类似pclose()函数my_popen()and my_pclose(),灵感来自 Apple 的开源实现popen() 和 pclose()

通过人工检查——例如ps在不同的终端中运行以寻找预期的子进程——popen()似乎在预期的子进程出现时起作用。

问题:如果我在之后立即调用它,为什么会my_pclose()立即返回?我的期望是等到子进程结束。errno == 10 (ECHILD)my_popen()my_pclose()

问题:鉴于上述情况,如果我在andmy_pclose()之间插入延迟,为什么会在子进程正常结束后按预期返回?my_popen()my_pclose()

问题:my_pclose()只有在子进程结束后才需要进行哪些更正才能可靠地返回,而不需要任何延迟或其他设计?


MCVE 下面。

一些上下文:我想让my_popen()用户 1)写入子进程' stdin,2)读取子进程' stdout,3)读取子进程' stderr,4)知道子进程' pid_t,5)在 fork 的环境中运行/exec 的进程可能是子进程或孙子进程,并且能够在后者的情况下杀死孙子进程(因此是setpgid())。

意外失败的执行:


参考文献:1 , 2 , 3


更新:
这个链接让我想知道在ingsetpgid( pid, 0 )之后添加父进程是否相关。fork()它似乎确实有效,因为在添加之后,my_pclose()立即调用my_popen()似乎会等到该过程完成。

老实说,我不太明白为什么这会有所作为。如果知识渊博的社区成员能提供见解,我将不胜感激。

0 投票
0 回答
25 浏览

valgrind - 在 fdopen 之后关闭 popen 流是否有任何问题

我看到一个奇怪的问题。示例代码包含在下面

当这段代码用 valgrind 运行时,它抱怨 popen 分配的内存仍然可以访问。我应该担心这个警告吗?如果是,有什么可能的解决方案?