C 语言popen函数,实现shell和读取内容

摘要:
Cmd是包含shell命令的字符串指针;如果类型为“r”,则文件指针连接到cmd的标准输出;如果类型为“w”,则文件指针连接到cmd的标准输入。

1. popen()函数

头文件:#include <stdio.h>

函数原型:FILE * popen(const char * command, const char * type);

关闭文件流:int pclose(FILE * stream);

  函数popen 先执行fork,然后调用exec以执行cmd,并且返回一个标准I/O文件指针。

  cmd是一个包含shell命令的字符串指针(以NULL结束字符结尾);
  如果type是"r",则文件指针连接到cmd的标准输出;
  如果type是"w",则文件指针连接到cmd的标准输入。

2. 描述

  popen() 函数用创建管道的方式启动一个进程, 并调用 shell. 因为管道是被定义成单向的, 所以type参数只能定义成只读或者只写, 不能是两者同时, 结果流也相应的是只读或者只写.

  command 参数是一个字符串指针, 指向的是 一个以 null 结束符结尾的字符串, 这个字符串包含一个 shell 命令. 这个命令被送到 /bin/sh 以 -c 参数执行, 即由 shell 来执行. type 参数也是一个 指向以 null 结束符结尾的字符串的指针, 这个字符串必须是 'r' 或者 'w’ 来指明是读还是写.

   popen() 函数的返回值是一个普通的标准I/O流, 它只能用 pclose() 函数来关闭, 而不是 fclose() 函数.

  注意, popen 函数的输出流默认是被全缓冲的;pclose 函数等待相关的进程结束并返回一个 command 命令的退出状态, 就像 wait4 函数 一样

3. 示例

 1 #include <stdio.h>
 2 
 3 int main(void)
 4 {
 5     FILE * fp;
 6     if ((fp = popen("ls -l", "r)) == NULL)
 7     {
 8         perror("open failed!");
 9         return -1;
10     }
11     char but[256];
12     while (fgets(but, 255, fp) != NULL)
13         printf("%s", buf);
14     if (pclose(fp) == -1)
15     {
16         perror("close failed!");
17         return -2;
18     }
19     return 0;
20 }

免责声明:文章转载自《C 语言popen函数,实现shell和读取内容》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[WinForm] TableLayoutPanel和FlowLayoutPanel的使用Devexpress实现自适应布局下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Shell编程基础教程1--Shell简介

1.Shell简介   1.1.查看你系统shell信息      cat /etc/shell  命令可以获取Linux系统里面有多少种shell程序      echo $SHELL  命令可以查看当前你所使用的shell是哪一个   1.2.查看文件信息,ls      ls -l  查看文件信息:文件类型、文件权限、文件硬链接数、文件所属用户、文件所...

chapter11:认识与学习bash之(1)认识shell与shell的变量功能

  使用终端的命令行就是通过bash 环境变量来处理的,bash还包括变量的设置与使用,bash操作环境的构建,数据流的重定向和管道等。 一,认识bash这个shell 1.什么是shell   我们一般通过shell来和内核进行通信,因为内核是要保护的。也就是说通过shell将我们的命令与内核通信,好让崔可以控制硬件来完成工作。   其实shell只是提...

VBScript入门篇

                           VBScript入门篇                                                       作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 一.定义一个过程 1 定义一个过程:可以将相同的操作的代码提取出来,方便其他人来调...

JBOSS未授权访问漏洞复现

目录 1.JBOSS是什么 2.JBOSS未授权访问是什么 3.漏洞环境搭建 4.漏洞复现 进入控制台 进入应用部署页面 上马 5.jexboss工具安装方法: 6.war的制作 1.JBOSS是什么 JBOSS是一个基于J2EE的开放源代码的应用服务器。 JBoss代码遵循LGPL许可,可以在任何商业应用中免费使用。JBoss是一个管理...

ansible 的用法

ansible 常用模块 1 command 模块 默认模块,不指定 -m 参数时,使用的就是 command 模块; 但 "<", ">", "|", and "&" 操作都不可以,当然,也不支持管道; 缺点:不支持管道,没法批量执行命令; 示例: ansible 192.168.2.20 -m command -a 'ifconfi...

linux(10)-linux环境下jdk配置自定义环境变量/etc/profile.d以及卸载自带openjdk

一、删除系统自带OpenJDK 以下操作,请切换至root权限进行操作 1.1、输入:rpm -qa | grep jdk  会查询出系统自带的OpenJDK及版本 [root@localhost /]# rpm -qa |grep jdkjava-1.7.0-openjdk-headless-1.7.0.51-2.4.5.5.el7.x86_64java...