父子进程间通信模型实现(popen)

2024-06-02 04:58

本文主要是介绍父子进程间通信模型实现(popen),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://blog.csdn.net/u011239443/article/details/51655334

0、FILE *popen(const char *command, const char *type);

popen 函数相当于做了以下几件事:

1、创建一个无名管道文件

2、 fork()

3、在子进程里, exec command

4、 在子进程里,

若 type == “r” ,  相当于进行:

int fd_new =  fopen("Pipe_Name",O_WRONLY); 
dup2(0,fd_new);

若 type == “w” ,  相当于进行:

int fd_new =  fopen("Pipe_Name",O_RDONLY); 
dup2(0,fd_new);

5、返回值 为 对管道文件 type类型操作的 文件指针

 

1、以读的方式popen

P1中:

1 fp_in = popen(cmd, "r") ;

popen的返回值  fp_in 文件指针 是管道文件的读文件指针

P2中:

popen(,“r”)把P2中的标准输出重定向到 管道文件 ,printf 相当于向管道文件 fputs

1 printf("%s\n", src );

 

具体代码:

p1:

 

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 int main(int argc, char* argv[])// ./my_reverse
 5 {    
 6     printf("pid: %d\n", getpid());
 7     FILE* fp_in ;
 8     char cmd[1024] ;
 9     char str[1024] ;
10     while(memset(str, 0, 1024), fgets(str, 1024, stdin) != NULL)
11     {
12         memset(cmd, 0, 1024);
13         sprintf(cmd, "%s %s", argv[1], str);
14         fp_in = popen(cmd, "r") ;
15         if(fp_in == NULL)
16         {
17             perror("popen");
18             exit(1);
19         }
20         memset(str, 0, 1024) ;
21         fscanf( fp_in, "%s", str );
22         printf("res: %s\n", str);
23 
24     }
25     return 0 ;
26 }

 

p2:

 

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 void handle(char* str)
 5 {
 6     int bg, end ;
 7     int tmp ;
 8     bg = 0; 
 9     end = strlen(str) - 1;
10     while(bg < end)
11     {
12         tmp = str[bg] ;
13         str[bg] = str[end] ;
14         str[end] = tmp ;
15         bg ++ ;
16         end -- ;
17     }
18 }
19 int main(int argc, char* argv[])//argv[1]
20 {    
21     char src[1024] ;
22     strcpy(src, argv[1]);
23     handle(src);
24     printf("%s\n", src );
25     return 0 ;
26 }

 

 

 

 

 

2、以写的方式popen

P1中:

1 fp_out = popen(argv[1], "w") ;

 

popen 的返回值 为 管道文件的 写文件指针

 

P2中:

popen(,“w”)把P2中的标准输入重定向到 管道文件 ,gets 相当于从管道文件 fgets

1 gets(src) 

 

具体代码:

p1:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 int main(int argc, char* argv[])// ./my_reverse
 5 {    
 6     printf("pid: %d\n", getpid());
 7     FILE* fp_out ;
 8     char cmd[1024] ;
 9     char str[1024] ;
10     fp_out = popen(argv[1], "w") ;
11     if(fp_out == NULL)
12     {
13         perror("popen");
14         exit(1);
15     }
16     while(memset(str, 0, 1024), fgets(str, 1024, stdin) != NULL)
17     {
18         fputs(str, fp_out);
19         fflush(fp_out);
20 
21     }
22     pclose(fp_out);
23     return 0 ;
24 }

 

P2:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 void handle(char* str)
 5 {
 6     int bg, end ;
 7     int tmp ;
 8     bg = 0; 
 9     end = strlen(str) - 1;
10     while(bg < end)
11     {
12         tmp = str[bg] ;
13         str[bg] = str[end] ;
14         str[end] = tmp ;
15         bg ++ ;
16         end -- ;
17     }
18 }
19 int main(int argc, char* argv[])
20 {    
21     char src[1024] ;
22     while(memset(src, 0, 1024), gets(src) != NULL )
23     {
24         handle(src);
25         printf("pid: %d  %s\n", getpid() ,src );
26     }
27     return 0 ;
28 }

 

这篇关于父子进程间通信模型实现(popen)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1023082

相关文章

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.

SpringBoot实现动态插拔的AOP的完整案例

《SpringBoot实现动态插拔的AOP的完整案例》在现代软件开发中,面向切面编程(AOP)是一种非常重要的技术,能够有效实现日志记录、安全控制、性能监控等横切关注点的分离,在传统的AOP实现中,切... 目录引言一、AOP 概述1.1 什么是 AOP1.2 AOP 的典型应用场景1.3 为什么需要动态插

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Java实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超

windos server2022里的DFS配置的实现

《windosserver2022里的DFS配置的实现》DFS是WindowsServer操作系统提供的一种功能,用于在多台服务器上集中管理共享文件夹和文件的分布式存储解决方案,本文就来介绍一下wi... 目录什么是DFS?优势:应用场景:DFS配置步骤什么是DFS?DFS指的是分布式文件系统(Distr

NFS实现多服务器文件的共享的方法步骤

《NFS实现多服务器文件的共享的方法步骤》NFS允许网络中的计算机之间共享资源,客户端可以透明地读写远端NFS服务器上的文件,本文就来介绍一下NFS实现多服务器文件的共享的方法步骤,感兴趣的可以了解一... 目录一、简介二、部署1、准备1、服务端和客户端:安装nfs-utils2、服务端:创建共享目录3、服

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭