函数解释
百度百科:
popen() 函数通过创建一个管道,调用 fork 产生一个子进程,执行一个 shell 以运行命令来开启一个进程。这个进程必须由 pclose() 函数关闭,而不是 fclose() 函数。pclose() 函数关闭标准 I/O 流,等待命令执行结束,然后返回 shell 的终止状态。如果 shell 不能被执行,则 pclose() 返回的终止状态与 shell 已执行 exit 一样。
返回值
如果调用fork()或pipe()失败,或者不能分配内存将返回NULL,否则返回标准I/O流。popen()没有为内存分配失败设置errno值。如果调用fork()或pipe()时出现错误,errno被设为相应的错误类型。如果type参数不合法,errno将返回EINVAL。
popen是利用管道实现,管道相比于普通文件,它不可以重定位,即不能使用fseek,ftell这种api,读出来的数据不会再被写回去。
#include<stdio.h>
#define _LINE_LENGTH 300
int main(void)
{
FILE *file;
char line[_LINE_LENGTH];
file = popen("ls", "r");
if (NULL != file)
{
while (fgets(line, _LINE_LENGTH, file) != NULL)
{
printf("line=%s\n", line);
}
}
else
{
return 1;
}
pclose(file);
return 0;
}
popen只是将命令的标准输出嫁接到了当前进程,假如需要命令子进程的标准错误信息可以用重定向,执行命令的时候将标准错误重定向到标准输出 2>&1
有的使用fread来获取数据
fgets的返回值
fgets什么时候返回:读到换行符、缓冲区被读满、文件被读完、发生错误。注意:发生错误的时候会返回NULL.
fgets当被信号中断时,就会返回NULL。但是如果前面已经读了一些数据,还是会返回NULL。那么前面返回的数据就丢失了,因为管道并没有文件偏移一说。
fread的返回值
fread返回实际读到的字节数,所以当信号中断时,读到的字节都能返回回来,不会丢失。