【发布时间】:2017-11-02 05:32:29
【问题描述】:
我正在开发一个使用 popen() 查找文件的程序。然后将 popen() 返回的流中的数据复制到一个 char 数组中并打印出来。
#include <iostream>
#include <cstdio>
#include <cstring>
int main()
{
char command[1024];
char ch = 'a';
FILE* pf;
while(ch < 'd')
{
sprintf(command, "find /home/ypatil/interest -name \\%c.out", ch);
std::cout << std::endl << command << std::endl;
pf = popen(command, "r");
if(pf)
{
char src[256];
fgets(src, 256, pf);
std::cout << std::endl << "pf = " << src << std::endl;
}
pclose(pf);
++ch;
}
return 0;
}
现在,我正在循环执行此操作,我发现如果正在搜索的文件程序不存在,则文件流pf 将保留其旧值。我的系统上只存在a.out 文件。所以,这个程序的输出是 -
find /home/ypatil/interest -name \a.out
pf = /home/ypatil/interest/a.out
find /home/ypatil/interest -name \b.out
pf = /home/ypatil/interest/a.out
find /home/ypatil/interest -name \c.out
pf = /home/ypatil/interest/a.out
因此,您可以看到 find 正在搜索不同的文件,并且只有 a.out 存在。因此,其他文件将失败。但是,pf 仍然在每次迭代中保留其数据。我想知道为什么它保留了popen 在之前的迭代中返回的FILE * 的值。
谢谢。
【问题讨论】:
-
您要求
popen执行find程序,它会这样做。find程序是否失败与popen仍然执行它无关。 -
另一方面,有些事情你却做不到。例如,即使
popen失败并返回空指针,您也无条件地 调用fflush(pf)。你打电话给fgets没有检查它是否成功! -
@Someprogrammerdude - 我的问题是为什么 FILE* pf 数据即使查找失败也保持不变?当 find 命令找不到给定文件时,它在标准输出上不返回任何内容。使用 fgets() 的全部意义在于证明 FILE* pf 指向下一次迭代中的先前数据。 pf 不应该有新的价值吗?
-
popen和FILE指针不是这样工作的。popen函数只会返回一个空指针(你不应该将它传递给fflush!)如果它不能真正执行程序。程序执行,但没有输出,fgets检查返回一个空指针! -
Yiur 声明可以分为两部分。一,那个 fgets 成功地从文件中读取了一个新行;第二,该行与先前从完全不同的文件中读取的行神秘地相同。现在你明白了,如果第一个说法被证明是不真实的,那么就没有新的线可以与其他线进行比较了吗?你能验证或伪造第一个声明吗?
标签: c++ linux pipe popen glibc