博客
关于我
[apue] 使用 popen/pclose 的一点疑问
阅读量:427 次
发布时间:2019-03-06

本文共 1841 字,大约阅读时间需要 6 分钟。

popen与pclose的高级I/O重定向技术

引言

在计算机操作中,常常需要将程序的输出作为标准输入传递给其他命令,或者将外部命令的输出作为程序的输入处理。传统的实现方式是通过管道与进程的分割(fork+exec)来实现,但这种做法在复杂场景下存在效率问题和资源管理难度。而popen和pclose函数的出现,为我们提供了一种更加简便且高效的方式来处理这种I/O重定向任务。

popen函数的基本使用

popen函数是一个强大的工具,可以让我们轻松地将程序的输出重定向给外部命令。例如:

FILE* fpout = popen("more", "w");

上述代码创建了一个输出文件指针fpout,并执行了"more"命令。通过将标准输出写入fpout,我们就可以将输出内容重定向到"more"命令中。

同样地,读取外部命令的输出可以通过popen实现:

FILE* fpin = popen("ls -l .", "r");

这样我们就可以读取"ls -l ."命令的输出内容,并将其作为程序的输入处理。

popen内部实现机制

apue中对popen的实现描述为:

"这两个函数实现的操作是:创建一个管道,调用fork产生一个子进程,关闭管道的不使用端,执行一个shell以运行命令,然后等待命令终止。"

这段描述揭示了popen函数的工作原理:通过创建一个管道,启动一个子进程来执行外部命令,并将子进程的标准输入或输出与父进程的相应文件描述符连接起来。这种方式避免了直接调用fork和exec的复杂性,同时也简化了管道的管理。

程序验证与实际问题分析

为了更好地理解popen的工作机制,我编写了一个简单的测试程序:

int main() {
FILE* fpin = popen("ls -l .", "r");
char buffer[1024];
while (fgets(buffer, sizeof(buffer), fpin) != NULL) {
printf("读取到的内容:%s\n", buffer);
}
pclose(fpin);
return 0;
}

运行上述程序后,打开终端窗口,可以看到程序会读取当前目录下文件的详细列表。同时,在另一个终端窗口中,执行

ps aux | grep more

可以看到与"more"命令相关的进程ID。接着,执行

lsof -i :23153

lsof -i :23154

可以观察到在子进程"more"中确实存在名为"pipe"的FIFO命名管道。而在父进程中却找不到对应的管道,这是由于管道是跨进程通信的工具,只能在子进程和父进程之间使用,不能在同一进程中查看。

总结

popen和pclose函数为我们提供了一种简便的方式来处理命令的输入输出重定向。通过调用这些函数,我们可以轻松地将程序与外部命令进行通信,而无需手动管理复杂的进程和管道结构。然而,在实际应用中,仍需注意管道的打开和关闭顺序,以避免资源泄漏或其他潜在问题。理解这些工具的工作原理,对于优化程序性能和解决实际问题具有重要意义。

转载地址:http://hopuz.baihongyu.com/

你可能感兴趣的文章
openstack【Kilo】汇总:包括20英文文档、各个组件新增功能及Kilo版部署
查看>>
openstack下service和endpoint
查看>>
【Docker知识】重定向 Docker 的根目录
查看>>
Openstack企业级云计算实战第二、三期培训即将开始
查看>>
OpenStack创建虚拟机实例实战
查看>>
OpenStack安装部署实战
查看>>
OpenStack实践系列⑨云硬盘服务Cinder
查看>>
OpenStack架构
查看>>
OpenStack版本升级与故障排查实战
查看>>
Openstack的HA解决方案【替换原有的dashboard】
查看>>
OpenStack的基本概念与架构详解
查看>>
Openstack的视频学习
查看>>
OpenStack自动化安装部署实战(附OpenStack实验环境)
查看>>
openstack虚拟机迁移live-migration中libvirt配置
查看>>
OpenStack项目管理实战
查看>>
OpenStreetMap初探(一)——了解OpenStreetMap
查看>>
openSUSE 13.1 Milestone 2 发布
查看>>
openSUSE推出独立 GUI 包管理工具:YQPkg,简化了整个软件包管理流程
查看>>
OpenVP共用账号 一个账号多台电脑登录
查看>>
OpenVSwtich(OVS)Vlan间路由实战 附实验环境
查看>>