unix系统编程
【popen &pclose】
popen接口定义:
#include <stdio.h>
FILE *popen(const char *command, const char *type);
int pclose(FILE *stream);
popen函数会创建一个管道,并且创建一个子进程来执行shell,shell会创建一个子进程来执行command,
根据type的值不同,分成两种情况:
如果type是r: command执行的标准输出,就会写入管道,从而被调用popen的进程读到,通过对popen返
回的FILE类型指针执行read或fgets操作,就可以读取到command的标准输出。
如果type是w:调用popen的进程可以通过对FILE类型指针执行write、fputs等操作,负责往管道里面写
入,写入的内容经过管道传递给执行command的进程,作为命令的的输入。
popen函数成功时,会返回stdio库封装的FILE类型的指针,失败时会返回NULL,并且设置errno,
常见的失败有fork失败、pipe失败,或者分配内存失败。
I/O结束后,可以调用pclose函数来关闭管道,并且等待子进程的退出。pclose函数成功时会返回
子进程shell的终止状态。popen函数和system函数类似,如果command对应命令无法执行,就如同
执行了exit(127)一样,如果发生其它错误,pclose函数则返回-1.可以从errno中获取到失败的原因。
命令执行后需要获取命令的返回值,可以通过如下几个宏来获取:
1. 进程正常退出
WIFEXITED(status) : 如果子进程正常退出,则返回true,否则返回false
WEXITSTATUS(status):如果子进程正常退出,则本宏用来获取进程的退出状态
2. 进程收到信号,导致退出
WIFSIGNALED(status) : 如果进程是被信号杀死的,则返回true,否则返回false
WTREMSIG(status):如果进程是被信号杀死的,则返回杀死进程信号的值
WCOREDUMP(status) : 如果子进程产生了core dump,则返回true,否则返回false
使用pclose关闭popen打开的文件时应注意,pclose的参数不能是NULL。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~