父子进程间通信模型实现(popen)
来源:互联网 发布:微众银行程序员工资 编辑:程序博客网 时间:2024/05/29 02:09
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 }
0 0
- 父子进程间通信模型实现(popen)
- 父子进程间通信
- 父子进程间信号通信
- 利用共享存储实现父子进程间的通信
- C语言无名管道实现父子进程间通信
- 09-进程间通信-无名管道(父子进程间)
- 通信方式--管道(父子进程通信)
- 父子进程间的单向管道通信
- 匿名管道 父子进程间通信
- python之父子进程间通信
- 父子进程间的共享内存通信
- 父子进程间通信---通过设置环境变量
- Nginx---父子进程通信
- 父子进程通信
- UNIX环境高级编程学习之第十五章进程间通信 - 通过半双工匿名管道实现父子进程通信
- 两个很有用的进程间通信函数popen,pclose
- 无名管道及用其实现父子进程间的通信
- 应用管道实现父子进程之间的通信
- C#双链表
- leetcode 223. Rectangle Area
- Android产品研发(十)-->尽量不使用静态变量保存数据
- mysql按时间统计
- 1 server - n clients 模型实现(select)
- 父子进程间通信模型实现(popen)
- clients(PV操作共享内核内存进行输入输出分屏) - server(进程间通信)模型实现
- EL表达式详解
- Android环境搭建
- iOS 蓝牙连接
- 从rman全备恢复数据库的步骤
- 《世界杯彩票竞猜系统》设计报告
- Java开发相关的一些优秀网站集锦
- JavaScript编写病毒