linux程序设计——如何实现popen(第十三章)
2015-07-09 21:34
736 查看
13.3.2 如何实现popen
请求popen调用运行一个程序时,它首先启动shell,即系统中的sh命令,然后将command字符串作为一个参数传递给它,这有两个效果,一个好,一个不好.在linux中,所有的参数扩展都是由shell来完成的.所以,在启动程序之前先启动shell来分析命令字符串,就可以使各种shell扩展(如*.c所指的是哪些文件)在程序启动之前就全部完成.这个功能非常有用,它允许通过popen启动非常复杂的shell命令.而其他一些创建进程的函数(如execl)调用起来就复杂的多,因为调用进程必须自己去完成shell扩展.
使用shell的一个不太好的影响是,针对每个popen调用,不仅要启动一个被请求的程序,还要启动一个shell,即每个popen调用将多启动两个进程.从节省系统资源的角度来看,popen函数的调用成本略高,而且对目标命令的调用比正常方式要慢一些.
用程序popen4.c来演示popen函数的行为.这个程序对所有popen示例程序的源文件的总行数进行统计,方法是用cat命令显示文件的内容并将输出通过管道传递给命令wc -l,由后者统计总行数.如果是在命令行上完成这一任务,可以用如下命令:
$ cat popen*.c | wc -l
事实上,输入命令wc -l popen*.c更简单而且更有效率,但是为了通过这个例子演示popen函数的工作原理还是如上使用.
编写程序popen4.c.
/************************************************************************* > File Name: popen4.c > Description: popen4.c程序演示popen函数的行为,它对所有popen示例程序的源文件的总行数进行统计 > Author: Liubingbing > Created Time: 2015年07月09日 星期四 20时39分42秒 > Other: popen4.c ************************************************************************/ #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> int main() { FILE *read_fp; char buffer[BUFSIZ + 1]; int chars_read; memset(buffer, '\0', sizeof(buffer)); read_fp = popen("cat popen*.c | wc -l", "r"); if (read_fp != NULL) { chars_read = fread(buffer, sizeof(char), BUFSIZ, read_fp); printf("chars_read = %d\n", chars_read); while (chars_read > 0) { buffer[chars_read - 1] = '\0'; printf("Reading:-\n %s\n", buffer); chars_read = fread(buffer, sizeof(char), BUFSIZ, read_fp); } pclose(read_fp); exit(EXIT_SUCCESS); } exit(EXIT_FAILURE); }这个程序显示,shell在启动后将popen*.c扩展为一个文件列表,列表中的文件名都以popen开头,以.c结尾,shell还处理了管道符|,并将cat命令的输出传递给wc命令.在一个popen调用中启动了shell,cat程序和wc程序,并进行了一次输出重定向.而调用这些命令的程序只看到最终的输出结果.
程序popen4.c结果如下所示:(read_fp指向的文件中保存的应该就是cat popen*.c | wc -l返回的数值146.
相关文章推荐
- XenApp_XenDesktop_7.6实战篇之二十:Linux Virtual Desktop 1.0(上篇)
- XenApp_XenDesktop_7.6实战篇之二十:Linux Virtual Desktop 1.0(上篇)
- 奔跑中的2015:Linux运维学习八大禁忌
- Linux进程调度算法之O(1)算法
- CentOS7.0 OpenWrt环境搭建
- linux下一个rsync工具和配置
- 创建linux系统的initramfs / ramdisk
- linux命令行操作之文件操作总结
- linux中操作java进程
- linux 信号相关概念
- linux中操作java进程
- Linux C语言程序设计(四)——枚举与结构体
- linux程序设计——管道输出数据到popen(第十三章)
- no libsigar-x86-linux.so in java.library.path
- Linux环境下段错误的产生原因及调试方法小结
- linux tty下调整分辨率
- 自己控制文件安全上下文
- linux 信号相关概念
- 在VMware上安装CentOS遇到的问题汇总
- 【Linux学习笔记】Linux/UNIX系统调用详解(资料整理)