问题标签 [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.
c - 重新分配后的分段错误
这是我的代码:
当我执行代码时,我的程序崩溃了。输出是分段错误,在 pclose(fp) 命令之前。当我删除 realloc 程序运行良好。也许我对 realloc 做错了什么?
c++ - C++ popen 管道没有正确关闭“ps aux”命令的 pclose
我正在运行 MacOS 并希望执行“ps aux”命令并通过我的应用程序获取其输出。我编写了一个使用 popen 函数执行命令的方法:
我有一个不断运行 exec("ps aux") 函数的循环。问题是来自 popen 的管道没有关闭,我已经使用终端中的“lsof”命令进行了检查。大约 20 秒后,应用程序打开了大约 300 个文件描述符,这阻止了应用程序从循环中打开更多管道(运行“ps aux”命令)。
我发现,exec 函数适用于其他命令(管道正确关闭),例如“netstat”,因此它必须是“ps aux”命令中阻止管道关闭的东西。
我已经搜索了很多关于该问题的信息,但没有找到任何解决方案。有人可以指出我正确的方向吗?
谢谢!
c - Pclose 似乎使进程失败
这个问题是这个问题的后续:Controlling a C daemon from another program
我的目标是控制另一个程序的守护进程执行。
守护进程的代码非常简单。
我已经为这个守护进程实现了一个 SystemV 初始化脚本,如下所示
从命令行使用这个脚本来控制守护进程的执行效果很好。
所以现在的目标是使用另一个 c 程序中的这个脚本来启动守护进程并从这个程序控制它的执行。
我已经实现了一个简单的 C 程序,它:
- 使用“开始”参数启动脚本
- 等待 pid 文件创建
- 从 pid 文件中读取守护进程的 pid
- 通过检查文件的存在来定期检查守护进程是否处于活动状态
/proc/<daemon_pid>/exec
- 如果守护进程被杀死,请重新启动它
这是我面临的问题。该程序只有在我不调用时才能正常运行pclose
。
这是程序的代码
据我了解pclose
,应该等待子进程终止,并且只有当子进程返回时,它才会关闭管道。
所以我不明白为什么我的实现在pclose
不调用它的情况下不起作用。
pclose
这是带有和不带注释块的日志
无需pclose
调用:
调用pclose
:
如您所见,守护进程永远不会启动,pid 文件也永远不会创建。
即使我的程序在没有pclose
我的情况下工作,我也想了解调用pclose
.
当行为良好而不调用它时,为什么 usingpclose
会使程序失败?
编辑:
以下是有关错误案例的更多信息
errno 是Success
WIFEXITED 宏返回 true
WEXITSTATUS 宏返回 141
通过进一步调试,我指出修改 init 脚本以将输出记录到文件使其工作......为什么?
c++ - 在 pclose() 之前从 popen()ed FILE* 读取的输出是否完整?
pclose()
的手册页说:
pclose() 函数等待相关进程终止并返回由 wait4(2) 返回的命令的退出状态。
我觉得这意味着如果用 type 打开关联的FILE*
创建以读取的输出,那么直到调用. 但是在 之后,关闭肯定是无效的,那么你怎么能确定你已经阅读了整个输出呢?popen()
"r"
command
pclose()
pclose()
FILE*
command
为了举例说明我的问题,请考虑以下代码:
我的问题,如上图所示:如果我们只是确定产生输出的子进程在 之后终止pclose()
,我们怎么知道用 检索的内容fread()
是完整的?但是,如果我们等到 , 之后pclose()
是fp
无效的,那么我们就无法再从任何地方检索命令的输出了,对吧?
这感觉就像一个先有鸡还是先有蛋的问题,但我已经看到了与上面类似的代码,所以我可能误解了一些东西。我很感激对此的解释。
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)。
c - Turbo C 库中不包含 popen、pclose 和 getdelim 函数
这个问题很直接......
管道函数(popen 和 pclose)和getdelim 函数不包含在我正在使用的Borland Turbo C 库中。
我无法编译任何涉及这些函数的代码。MinGw 的库在其stdio.h中包含这些函数,但是当我在计算机上使用它进行编译时,MinGw 崩溃。
那么,我可以制作单独的文件 popen.c、pclose.c 和 getdelim.c 并使用 Turbo C 上的主要代码编译它们吗?我应该如何定义和初始化这些函数?
我不知道这些函数的代码,所以任何代码都会很有帮助......
c - 为什么 pclose 过早返回?
更新 1:此问题已更新,以消除多线程,简化其范围。原来的问题popen
在主线程中,pclose
子进程在不同的线程中。通过在同一个(主)线程中执行popen
and ,所询问的问题可以更简单地重现。pclose
更新 2:在如何检查 libc 版本的响应者的帮助下?,我想我已经确定正在使用的 libc 是 uClibc 0.9.30。
下面的代码popen
是主线程中的一个脚本,稍等片刻,然后pclose
是同一个主线程中的子进程。该程序针对多个交叉目标进行了交叉编译。
可执行文件的代码:
剧本:
预期的行为是编译的可执行文件在子进程中生成脚本的执行,等待其完成,然后退出。这在包括 x86、x64 和 ARM 在内的许多跨目标上都得到了满足。以下是满足预期行为的示例架构、编译和相应的日志:
汇编:
mybin.log:
myscript.log:
然而,在一个目标上,发生了一件奇怪的事情:pclose
提前返回:在脚本开始运行之后,但在它完成运行之前很久——为什么?以下是观察到意外行为的问题架构、交叉编译器标志和相应的日志:
交叉编译:
mybin.log:
myscript.log:
我的问题的要点是:为什么pclose
过早返回,为什么只在这个交叉目标上?
评论和研究让我认为这是变体/版本中的一个错误libc
- 如果了解该主题的人可以帮助确认是否是这种情况,那就太好了。
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()
)。
意外失败的执行:
更新:
这个链接让我想知道在ingsetpgid( pid, 0 )
之后添加父进程是否相关。fork()
它似乎确实有效,因为在添加之后,my_pclose()
立即调用my_popen()
似乎会等到该过程完成。
老实说,我不太明白为什么这会有所作为。如果知识渊博的社区成员能提供见解,我将不胜感激。
valgrind - 在 fdopen 之后关闭 popen 流是否有任何问题
我看到一个奇怪的问题。示例代码包含在下面
当这段代码用 valgrind 运行时,它抱怨 popen 分配的内存仍然可以访问。我应该担心这个警告吗?如果是,有什么可能的解决方案?