当前位置:网站首页>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。

原网站

版权声明
本文为[玛丽苏打肉饼]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_43873960/article/details/121612324