首页 > linux进程间通信:popen函数通过管道与shell通信

linux进程间通信:popen函数通过管道与shell通信

函数描述

FILE *popen(const char* command,const char* type)

该函数的执行过程如下:

a. 调用pipe创建一个管道,并fork创建一个子进程来执行shell,shell会创建一个子进程来执行commad

b. 将父进程的输入输出重定向到管道,建立一个单向的数据流

c. 返回一个文件指针fp给父进程,父进程可根据fp对管道进行读写

d. 模式一:向管道中读数据,读命令的标准输出 fp = popen(command,"r"; ,子进程的标准输出写入到管道,被调用popen的父进程读取,父进程通过对popen返回的文件指针fp进行读管道,获取命令执行的结果。

d. 模式二:向管道中写数据,写入该命令的标准输入fp = popen(command,"w");,主要操作是调用popen的父进程向管道写入内容,写入的内容通过管道传给子进程,作为子进程的输入。

返回值:

如果调用fork()或pipe()失败,或者不能分配内存将返回NULL,否则返回标准I/O流

代码实现

#include 
#include #define BUF_SIZE 1024  void popen_read()
{ FILE * p_file = NULL;char buf[BUF_SIZE] = { 0};p_file = popen("lsmod|grep crc", "r");if (!p_file) { fprintf(stderr, "Erro to popen");}//fgets(buf,sizeof(buf),p_file);fread(buf,1,1024,p_file);printf("%s", buf);pclose(p_file);
}void popen_write()
{ FILE * p_file = NULL;char buf[BUF_SIZE] = { 0};p_file = popen("cat > write.log","w");if (p_file == NULL) { exit (-1);}fwrite("crc",1,sizeof("crc"),p_file);pclose(p_file);
}
int main(void)
{ popen_read();popen_write();return 0;
}

输出如下:

[root@node1 ~]# ./a.out 
libcrc32c              12644  2 xfs,iscsi_scst
crc32_pclmul           13113  0 
crc_t10dif             12714  1 sd_mod
crct10dif_pclmul       14289  1 
crct10dif_common       12595  2 crct10dif_pclmul,crc_t10dif
crc32c_intel           22079  1 
[root@node1 ~]# cat write.log 
crc

更多相关:

  • 在我们面试过程中,面试官经常会问到这么一个问题,那就是从在浏览器地址栏中输入URL到页面显示,浏览器到底发生了什么?这个问题看起来是老生常谈,但是这个问题回答的好坏,确实可以很好的反映出面试者知识的广度和深度。本文从浏览器角度来告诉你,URL后输入后按回车,浏览器内部究竟发生了什么,读完本文后,你将了解到:浏览器内有哪些进程,这些...

  • 进程与线程进程(process)就是任务,是计算机系统进行资源分配和调度的基本单位[1]。比如,打开一个word文件就是启动了一个word进程。线程(thread)是进程内的子任务。比如word中可以进行编辑、拼写检查和打印等子任务。我们目前的操作系统都是多任务的操作系统,多任务的实现方式[2]:多进程多线程多进程 + 多线程多进程:...

  • 运行cmd netstat -aon|findstr 80 然后 taskkill -f -pid 32428(这个就是pid进程编号) 回车   进程死翘翘了~ 去愉快玩耍吧~哦对了 别忘记一健三联关注我哟~...

  • 首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的。其实TCP/IP协议族已经帮我们解决了这个问题,网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用程序(进程)。这样利用三元组(ip地址,协议,端口)就可以标识网...

  • 1.      SIGTERM “kill pid” 会发送SIGTERM到进程pid. This is the termination signal sent by killcommand by default. 2.      SIGINT 在终端中敲入interrupt key(DELETE或ctrl+c)会产生SIG...

  • 本例的初始文件是4位数字 (e.g. 0001.png),想在前面补1个0 (00001.png) import numpy as np import cv2 from ptsemseg.utils import recursive_glob import osroot = "./src/" root1 = "./dst/" fil...

  • 方法一: QString file("sample.jpg"); if (file.contains(".jpg") ||      file.contains(".bmp") ||      file.contains(".png")) {     qDebug()<<"这是图片。"; } 方法二: QString file_...

  • shell中可能经常能看到:>/dev/null 2>&1 命令的结果可以通过%>的形式来定义输出 分解这个组合:“>/dev/null 2>&1” 为五部分。 1:> 代表重定向到哪里,例如:echo "123" > /home/123.txt 2:/dev/null 代表空设备文件 3:2> 表示stderr标准错误...

  • 第三步,使用JODConverter将office文档转换为pdf       JODConverter是一个java的OpenDucument文件转换器,可以进行许多文件格式的转换,它利用 OpenOffice来进行转换工作,它能进行以下的转换工作:      1.Microsoft Office格式转换为OpenDucument...