使用popen时必须关闭流
正如标题所说,我不确定是否应关闭使用popen打开的流.
我不确定的原因是因为每次我在使用popen打开的流上调用pclose时,我得到一个-1返回代码. 如果我之后打电话给perror,我收到以下消息.
我在下面使用的代码基本上是运行一个命令并捕获它的输出.我从最后一行得到错误(返回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会通知您. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ios – 将现有项目转换为可自定义的框架
- 两级联动菜单的实现之二 --- 用ajax实现菜单联动
- 基于jibx解析xml中有很多field的xml
- c# – ASP.NET Web窗体页中的类属性(?)
- Postgresql提供的用户名和经过身份验证的用户名不匹配
- PostgreSql中WITH语句的使用
- (5) Cocos2d-x 3.x开发——导入Cocostudio资源
- ruby-on-rails – 为什么request.env [‘REMOTE_ADDR’]返回
- ruby – 数量超出了ActiveRecord :: Type :: Integer,限制为
- oracle – PL / SQL:如何从游标创建类型