命令访问不存在的文件时弹出错误状态
Posted
技术标签:
【中文标题】命令访问不存在的文件时弹出错误状态【英文标题】:error status from popen when the command accesses a non existent file 【发布时间】:2019-07-20 13:00:05 【问题描述】:考虑以下两行代码
sprintf(comm, "cat %s.bz2 | bunzip2 -dc", string);
fp = popen(comm, "r");
如果我打开一个文件但该文件不存在,我将简单地得到一个 NULL 文件。但是,如果我使用popen
通过bunzip2
传递文件,如果基础文件不存在或已损坏,那么fp
将有一个有效的指针而不是NULL。显而易见的检查方法似乎是检查 popen
运行的命令的退出状态,但这似乎不可能。
如果命令失败,有没有一种简单的方法可以让popen
返回 null?
【问题讨论】:
你不应该提交 UUoC (Useless Use ofcat
);你应该使用:sprintf(comm, "bunzip2 -dc %s.bz2", string);
。在一个层面上,对于小文件(比如小于 1 GB 的文件),这可能无关紧要。如果您处理的是大文件,它确实会影响性能——您会不必要地复制文件中的数据。
如果你想读取bzip2压缩文件的内容,你可以直接使用<bzlib.h>
类似stdio的API(BZ2_bzopen()
、BZ2_bzread()
等),而不是搞乱popen()
.
@Shawn 评论的源代码在这里:sourceware.org/bzip2/downloads.html
【参考方案1】:
如果命令失败,有没有一种简单的方法可以让 popen 返回 null?
没有。
popen()
的任务不是决定它成功运行(即:启动)的命令是否失败。如果一个命令被认为“失败”完全取决于它运行的逻辑应用程序级上下文。
仍然,如果 popen()
没有返回NULL
它需要 对pclose()
的相关调用。后一个调用的结果告诉您popen()
运行的退出状态。使用此退出状态,调用程序可以决定如何解释popen()
的结果,从成功到失败。
【讨论】:
以上是关于命令访问不存在的文件时弹出错误状态的主要内容,如果未能解决你的问题,请参考以下文章
错误信息:无法连接: SQL Server 不可用或不存在。
启动Tecplot3602011时弹出:无法启动此程序,因为计算机中丢失libfftw-3dll.尝试重新安装以解决此问题.