当我们在调用popen()会创建一个管道,其实popen()会调用fork()函数产生一个子进程,执行shell以运行命令开启一个,并把执行结果写入管道中,然后返回一个文件指针。程序通过文件指针可读取管道中的内容。使用popen()创建的标准管道流需要plcose()进行关闭。
该函数的原型是FILE * popen(const char* command, const char *type);
command:使我们要执行的命令,即上述的运行命令,
type:有两种可能的取值,“r”(代表读取)或者“w"(代表写入)
popen()会调用fork()产生子进程,然后从子进程中调用/bin/sh-c来执行参数command的指令,参数type可使用“r”读取
或者“w”写入,根据type的值,popen()会创建管道连接到子进程的标准输出设备或者标准输入设备,然后返回一个文件指针。随后进程就可以利用此文件指针来读取子进程的标准输出设备或者写入子进程的标准输入设备。
个人总结:记住,向这个流中写内容相当于写入该命令(或者是该程序)标准输入;
向这个流中读数据相当于读取该命令(或者是该程序)的标准输出
该upcase命令或者程序用于实现将标准输入中的大写字母转换成小写
这里popen()函数中type参数“w”的功能就相当于给upcase.c中传入参数,同理
如果我们把type的值“w”改为“r”的话,就更好理解了,我们就可以通过FILE *fp =
popen(command,"r"),,command的标准输出到了管道,我们就可以读取管道中的内容了,也就是从标准流管道中读取数据就是读取该命令的标准输出。