`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);