popen和pclose函数

本文介绍了在Linux环境下,如何使用标准I/O库中的popen函数启动子进程并建立管道进行通信。popen函数接受一个shell命令和模式(读或写),返回一个指向子进程的标准输出或输入的文件指针。而pclose函数用于关闭由popen启动的进程。通过这两个函数,父进程可以读取或写入子进程的输出或输入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

标准I/O函数库提供了popen函数,它启动另外一个进程去执行一个shell命令行。
这里我们称调用popen的进程为父进程,由popen启动的进程称为子进程。
popen函数还创建一个管道用于父子进程间通信。父进程要么从管道读信息,要么向管道写信息,至于是读还是写取决于父进程调用popen时传递的参数。
函数原型:
  #include “stdio.h”
  FILE *popen( const char* command, const char* mode )
  参数说明:
  command: 是一个指向以 NULL 结束的 shell 命令字符串的指针。这行命令将被传到 bin/sh 并使用 -c 标志,shell 将执行这个命令。
  mode: 只能是读或者写中的一种,得到的返回值(标准 I/O 流)也具有和 type 相应的只读或只写类型。如果 type 是 “r” 则文件指针连接到 command 的标准输出;如果 type 是 “w” 则文件指针连接到 command 的标准输入。


  返回值:
  如果调用成功,则返回一个读或者打开文件的指针,如果失败,返回NULL,具体错误要根据errno判断
  int pclose (FILE* stream)
  参数说明:
  stream:popen返回的文件指针
  返回值:
  如果调用失败,返回 -1
  作用:
  popen() 函数用于创建一个管道:其内部实现为调用 fork 产生一个子进程,执行一个 shell 以运行命令来开启一个进程这个进程必须由 pclose() 函数关闭。

例子:

管道读:先创建一个文件test,然后再test文件内写入“Read pipe successfully !”
  

#include “stdio.h”
  #include “stdlib.h”
  int main()
  {
  FILE *fp;
  char buf[200] = {0};
  if((fp = popen(“cat test”, “r”)) == NULL) {
  perror(“Fail to popen\n”);
  exit(1);
  }
  while(fgets(buf, 200, fp) != NULL) {
  printf(“%s”, buf);
  }
  pclose(fp);
  return 0;
  }
  //打印输出: Read pipe successfully !
  //管道读:
  #include “stdio.h”
  #include “stdlib.h”
  int main()
  {
  FILE *fp;
  char buf[200] = {0};
  if((fp = popen(“cat > test1″, “w”)) == NULL) {
  perror(“Fail to popen\n”);
  exit(1);
  }
  fwrite(“Read pipe successfully !”, 1, sizeof(“Read pipe successfully !”), fp);
  pclose(fp);
  return 0;
  }


  执行完毕后,当前目录下多了一个test1文件,打开,里面内容为Read pipe successfully !



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值