popen和fgets函数

`popen`和`fgets`都是在 C 语言编程中常用的函数,它们在不同方面发挥着重要作用。

**一、`popen`函数**

1. **函数功能**:

- `popen`函数用于创建一个管道,连接到一个子进程,这个子进程可以是一个 shell 命令。它允许程序与外部命令进行交互,执行命令并读取命令的输出或向命令发送输入。

- 例如,可以使用`popen`执行系统命令并获取命令的输出结果,方便地在 C 程序中调用外部工具和获取系统信息。

2. **函数原型**:

- `FILE *popen(const char *command, const char *type);`

- `command`是要执行的命令字符串。

- `type`是指定管道的方向,可以是"r"表示从子进程读取输出,或者是"w"表示向子进程写入输入。 3. **返回值**:

- 如果成功,`popen`返回一个指向`FILE`类型的流指针,可以使用标准的文件输入/输出函数(如`fgets`、`fputs`等)来操作这个流。

- 如果失败,返回`NULL`,并设置`errno`来指示错误原因。

4. **注意事项**:

- 使用`popen`创建的管道是单向的,要么用于读取子进程的输出,要么用于向子进程发送输入,不能同时进行读写。 - 在使用完毕后,应该调用`pclose`函数来关闭管道并等待子进程结束,以避免资源泄漏。

**二、`fgets`函数**

1. **函数功能**:

- `fgets`函数用于从指定的文件流中读取一行字符串。它从输入流中读取字符,直到遇到换行符`\n`、文件结束标志或达到指定的最大长度减一为止。 - 这个函数通常用于读取文本文件、标准输入或从管道中读取数据。

2. **函数原型**:

- `char *fgets(char *s, int n, FILE *stream);`

- `s`是指向存储读取字符串的字符数组的指针。

- `n`是要读取的最大字符数。

- `stream`是指向要读取的文件流的指针。

3. **返回值**:

- 如果成功读取一行,`fgets`返回`s`,即指向存储字符串的字符数组的指针。

- 如果到达文件末尾或发生错误,返回`NULL`。

4. **注意事项**:

- `fgets`会在读取的字符串末尾自动添加一个 null 终止符`\0`。

- 如果读取的行长度超过`n - 1`,`fgets`只会读取`n - 1`个字符,并在末尾添加`\0`,剩余的字符将留在输入流中等待下一次读取。

- 在从标准输入读取时,可以使用`Ctrl+D`(在 Unix/Linux 系统中)或`Ctrl+Z`(在 Windows 系统中)来表示文件结束。

总之,`popen`和`fgets`在 C 语言中可以结合使用来执行外部命令并读取命令的输出结果。

例如,可以使用`popen`执行一个命令,然后使用`fgets`从命令的输出流中逐行读取结果。这样的组合在需要与外部程序交互、处理命令输出或进行系统级操作时非常有用。

        FILE *pResultStr = popen(command, "r");
        if (pResultStr == NULL) {
            SPI_HAL_LOGERR("执行 pidof 命令失败\n");
            return;
        }
        if (fgets(szBuf, sizeof(szBuf), pResultStr) != NULL) {
            // 移除换行符
            szBuf[strcspn(szBuf, "\n")] = '\0';
        }
        pclose(pResultStr);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值