命令访问不存在的文件时弹出错误状态

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 of cat);你应该使用: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() 的结果,从成功到失败。

【讨论】:

以上是关于命令访问不存在的文件时弹出错误状态的主要内容,如果未能解决你的问题,请参考以下文章

VueJS:编译器错误状态数据属性在通过此属性访问时不存在

错误信息:无法连接: SQL Server 不可用或不存在。

如果分支不存在,如何删除没有错误消息的分支?

启动Tecplot3602011时弹出:无法启动此程序,因为计算机中丢失libfftw-3dll.尝试重新安装以解决此问题.

windows10家庭版,下载一个VC++,打开安装包的时弹出了一个对话框,说“文件名、目录名或卷语法不确

提示SQL Sever不存在或拒绝访问,要怎么解决