父子进程间通信模型实现(popen)
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(,fd_new);
若 type == “w” , 相当于进行:
int fd_new = fopen("Pipe_Name",O_RDONLY);
dup2(,fd_new);
5、返回值 为 对管道文件 type类型操作的 文件指针
1、以读的方式popen

P1中:
fp_in = popen(cmd, "r") ;
popen的返回值 fp_in 文件指针 是管道文件的读文件指针
P2中:
popen(,“r”)把P2中的标准输出重定向到 管道文件 ,printf 相当于向管道文件 fputs
printf("%s\n", src );
具体代码:
p1:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(int argc, char* argv[])// ./my_reverse
{
printf("pid: %d\n", getpid());
FILE* fp_in ;
char cmd[] ;
char str[] ;
while(memset(str, , ), fgets(str, , stdin) != NULL)
{
memset(cmd, , );
sprintf(cmd, "%s %s", argv[], str);
fp_in = popen(cmd, "r") ;
if(fp_in == NULL)
{
perror("popen");
exit();
}
memset(str, , ) ;
fscanf( fp_in, "%s", str );
printf("res: %s\n", str); }
return ;
}
p2:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void handle(char* str)
{
int bg, end ;
int tmp ;
bg = ;
end = strlen(str) - ;
while(bg < end)
{
tmp = str[bg] ;
str[bg] = str[end] ;
str[end] = tmp ;
bg ++ ;
end -- ;
}
}
int main(int argc, char* argv[])//argv[1]
{
char src[] ;
strcpy(src, argv[]);
handle(src);
printf("%s\n", src );
return ;
}
2、以写的方式popen

P1中:
fp_out = popen(argv[], "w") ;
popen 的返回值 为 管道文件的 写文件指针
P2中:
popen(,“w”)把P2中的标准输入重定向到 管道文件 ,gets 相当于从管道文件 fgets
gets(src)
具体代码:
p1:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(int argc, char* argv[])// ./my_reverse
{
printf("pid: %d\n", getpid());
FILE* fp_out ;
char cmd[] ;
char str[] ;
fp_out = popen(argv[], "w") ;
if(fp_out == NULL)
{
perror("popen");
exit();
}
while(memset(str, , ), fgets(str, , stdin) != NULL)
{
fputs(str, fp_out);
fflush(fp_out); }
pclose(fp_out);
return ;
}
P2:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void handle(char* str)
{
int bg, end ;
int tmp ;
bg = ;
end = strlen(str) - ;
while(bg < end)
{
tmp = str[bg] ;
str[bg] = str[end] ;
str[end] = tmp ;
bg ++ ;
end -- ;
}
}
int main(int argc, char* argv[])
{
char src[] ;
while(memset(src, , ), gets(src) != NULL )
{
handle(src);
printf("pid: %d %s\n", getpid() ,src );
}
return ;
}
父子进程间通信模型实现(popen)的更多相关文章
- swoole 父子进程间通信
<?php /** * 场景: * 监控订单表状态 父子进程通信 * 一个主进程 两个子进程实现 */ //设置主进程名 echo '主进程id:' . posix_getpid() . PHP ...
- 19重定向管道与popen模型
重定向 dup2 int dup(int fd) 重定向文件描述符 int newFd = dup(STDOUT_FILENO) newFd 指向 stdout int dup2(int fd1, ...
- linux下代替system的基于管道的popen和pclose函数
linux下使用system需要谨慎,那么代替它的方法是什么呢? 标准I/O函数库提供了popen函数,它启动另外一个进程去执行一个shell命令行. 这里我们称调用popen的进程为父进程,由pop ...
- Python多进程(1)——subprocess与Popen()
Python多进程方面涉及的模块主要包括: subprocess:可以在当前程序中执行其他程序或命令: mmap:提供一种基于内存的进程间通信机制: multiprocessing:提供支持多处理器技 ...
- Nginx学习之六-nginx核心进程模型
一.Nginx整体架构 正常执行中的nginx会有多个进程,最基本的有master process(监控进程,也叫做主进程)和woker process(工作进程),还可能有cache相关进程. 一个 ...
- 【IPC通信】基于管道的popen和pclose函数
http://my.oschina.net/renhc/blog/35116 [IPC通信]基于管道的popen和pclose函数 恋恋美食 恋恋美食 发布时间: 2011/11/12 23:20 ...
- 最快的进程间通信方式你get了么
前言:天下武功为快不破!在信息爆炸.快速发展的新时代...,扯远了....进程间通信方式有很多,但最快的方式你知道么?由我娓娓道来... 一.共享内存方式 主角闪亮登场了,噔噔瞪...,最快的方式就是 ...
- 进程间通信IPC (InterProcess Communication)
一.进程间通信的概念 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区, ...
- TCP/IP网络编程之进程间通信
进程间通信基本概念 进程间通信意味着两个不同进程间可以交换数据,为了完成这一点,操作系统中应提供两个进程可以同时访问的内存空间.但我们知道,进程具有完全独立的内存结构,就连通过fork函数创建的子进程 ...
随机推荐
- MySQL(19):SQL语句(MySQL)大全
SQL语句大全一.创建和删除数据库 1.创建用户 //创建用户且置密码,在MySQL中行,但在Oracle中行 ----必须在超级管理员身份下操作 create user hncu identifi ...
- Android(java)学习笔记99:android的短信发送器研究
1.第一种可以调用系统内部的短信程序. 之前我曾经出现过一个bug就是报错: android.content.ActivityNotFoundException: No Activity found ...
- Python 中使用optparse进行参数解析
使用过Linux/Unix的人都会知道,命令行下的很多命令都需要参数,在C语言中添加和解析参数比较繁琐.Python中提供了optparse模块可以非常方便地处理命令行参数. 1 命令行参数的样 ...
- 给jdk写注释系列之jdk1.6容器(5)-LinkedHashMap源码解析
前面分析了HashMap的实现,我们知道其底层数据存储是一个hash表(数组+单向链表).接下来我们看一下另一个LinkedHashMap,它是HashMap的一个子类,他在HashMap的基础上维持 ...
- linux nginx启动 重启 关闭命令
启动操作 nginx -c /usr/local/nginx/conf/nginx.conf -c参数指定了要加载的nginx配置文件路径 停止操作停止操作是通过向nginx进程发送信号来进行的 步骤 ...
- 只能在执行 Render() 的过程中调用 RegisterForEventValidation(RegisterForEventValidation can only be called during Render();
只能在执行 Render() 的过程中调用 RegisterForEventValidation(RegisterForEventValidation can only be called durin ...
- OpenXml Excel数据导入导出(含图片的导入导出)
声明:里面的很多东西是基于前人的基础上实现的,具体是哪些人 俺忘了,我做了一些整合和加工 这个项目居于openxml做Excel的导入导出,可以用OpenXml读取Excel中的图片 和OpenXml ...
- C# 每天温习一点(IEnumerable<TSource>)
1, IEnumerable<TSource> 多数屌丝写成 IEnumerable<T> 无论TSource还是T都代表一个意思:要枚举的对象的类型 .IEnumerab ...
- Ubuntu 15.04 中结束进程的命令
今天在尝试用ubuntu进行goAgent,一开始提示没有权限,无法复制证书文件,这个问题好办,只要在命令前面加个sudo获取超级管理员权限就可以了: 后来又提示:Socket Adress alre ...
- jQuery 的插件 dataTables
---恢复内容开始--- jQuery 的插件 dataTables 是一个优秀的表格插件,提供了针对表格的排序.浏览器分页.服务器分页.筛选.格式化等功能.dataTables 的网站上也提供了大量 ...