当前位置:网站首页>unix环境编程 第十五章 15.3 函数popen和pclose
unix环境编程 第十五章 15.3 函数popen和pclose
2022-08-09 10:26:00 【玛丽苏打肉饼】
常见的操作是创建一个连接到另一个进程的管道,然后读其输出或向其输入端发送数据,为此,标准I/O库提供了两个函数popen和函数pclose。
#include <stdio.h>
FILE *popen(const char *cmdsring,const char *type);
//成功返回文件指针,出错返回NULL
int pclose(FILE *fp);
//成功返回cmdstring的终止状态,失败返回-1
函数popen先执行fork,然后调用exec执行cmdstring,并且返回一个标准I/O文件指针,
如果type是"r",则文件指针连接到cmdstring的标准输出
如果type是"w",则文件指针链接到cmdstring的标准输出。
pclose的函数关闭标准I/O流,等待命令终止,然后返回shell的终止状态。
#include "apue.h"
#include <sys/wait.h>
#define PAGER "${PAGER:-more}"
int main(int argc,char *argv[])
{
char line[MAXLINE];
FILE *fpin,*fpout;
if(argc!=2)
err_quit("usage:a.out<pathname>");
if((fpin=fopen(argv[1],"r"))==NULL)
err_sys("can not open %s",argv[1]);
if((fpout=popen(PAGER,"w"))==NULL)
err_sys("popen error");
while(fgets(line,MAXLINE,fpin)!=NULL)
{
if(fputs(line,fpout)==EOF)
err_sys("fputs error to pipe");
}
if(ferror(fpin))
err_sys("fgets error");
if(pclose(fpout)==-1)
err_sys("pclose error");
exit(0);
}
每次调用popen的时候,因该记住所创建的子进程的进程ID,以及其文件描述符或者FILE指针,我们选择在数组childpid中保存子进程ID,我们选择在数组childpid中保存子进程ID,并用文件描述符作为其下标。
若pclose的调用者已经为信号SIGCHILD设置了一个信号处理程序,则pclose中的waitpid调用将返回一个错误EINTER.
如果应用程序调用waitpid,并且获得了popen创建的子进程的退出状态,那么我们会在应用程序调用pclose时调用waitpid,如果发现子进程已不再存在,将返回-1,将error设置为ECHILD。
边栏推荐
猜你喜欢
随机推荐
Cpolar内网穿透的面板功能介绍
KeyBERT和labse提取字符串中的关键词
OneNote 教程,如何在 OneNote 中搜索和查找笔记?
tuple dictionary collection
SQL Server查询优化
程序环境和预处理
收到人生第一笔五位数工资
技术分享 | 使用 cURL 发送请求
基本运算符
条件控制语句
Redis + NodeJS 实现一个能处理海量数据的异步任务队列系统
学习NET-SNMP之二-----------VisualStudio编译Net-SNMP
Nodejs服务端
electron 应用开发优秀实践
相伴成长,彼此成就 用友U9 cloud做好制造业数智化升级的同路人
[贴装专题] 贴装流程中涉及到的位置关系计算
Redis cache update strategy actively
程序员的专属浪漫——用3D Engine 5分钟实现烟花绽放效果
EndNote User Guide
虚拟列表key复用问题