使用popen时必须关闭流

使用popen时必须关闭流,第1张

概述正如标题所说,我不确定是否应关闭使用popen打开的流. 我不确定的原因是因为每次我在使用popen打开的流上调用pclose时,我得到一个-1返回代码. 如果我之后打电话给perror,我收到以下消息. pclose: No Child Processes 我在下面使用的代码基本上是运行一个命令并捕获它的输出.我从最后一行得到错误(返回pclose(fileListingStream);) in 正如标题所说,我不确定是否应关闭使用popen打开的流.

我不确定的原因是因为每次我在使用popen打开的流上调用pclose时,我得到一个-1返回代码.

如果我之后打电话给perror,我收到以下消息.

pclose: No Child Processes

我在下面使用的代码基本上是运行一个命令并捕获它的输出.我从最后一行得到错误(返回pclose(fileListingStream);)

int executeCommand(char *command) {    //The Stream to read that will contain the output of the command    file *fileListingStream;    char path[PATH_MAX];    //Run the commmand in read mode    fileListingStream = popen(command,"r");    //Ensure that its not null before continuing    if (fileListingStream == NulL)        return EXIT_FAILURE;    //Get the data from the stream and then print to the the console    while (fgets(path,PATH_MAX,fileListingStream) != NulL)        printf("%s",path);    //Close the stream and return its return code    return pclose(fileListingStream);}
解决方法 是的你应该.有关pclose()内部工作原理的说明,请参见 this answer.此外,您应该注意,wait4()中的错误可能是pclose()中明显失败的原因.

Update0

如果file *有效(在内部这表示文件描述符不是-1),如果出现错误,pclose()和fclose()将不会导致泄漏.值得注意的是,如果file *无效,那么无论如何都无需清理.正如我在链接中所讨论的那样,pclose()有额外的行为,即从proc文件链中删除file *,然后等待子进程终止.内部等待实际上是pclose()完成的第二件事,此时已经清理了所有内容.在等待之后,立即删除file的内容以表示其无效,无论waitpID()中是否有任何错误,都会发生这种情况.

鉴于您收到的错误,ECHILD,我可以明确地说,eglibc-2.11.1下的pclose()没有内存泄漏,并且可能至少在过去1 – 4年内任何glibc派生的库.

如果您希望完全确定,只需在valgrind下运行程序,然后触发ECHILD错误.如果有任何泄露,Valgrind会通知您.

总结

以上是内存溢出为你收集整理的使用popen时必须关闭流全部内容,希望文章能够帮你解决使用popen时必须关闭流所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1213294.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存