popen的用法

函数解释

百度百科:
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返回实际读到的字节数,所以当信号中断时,读到的字节都能返回回来,不会丢失。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值