父子进程间通信模型实现(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函数创建的子进程 ...
随机推荐
- Java SE ---数据类型
Java中数据类型(Data Type)分为基本数据类型(Primitive Data Type)和引用类型(Reference Data Type). Java中的基本数据类型共有以下8种: 1 ...
- argparse - 命令行选项与参数解析(转)
argparse - 命令行选项与参数解析(译)Mar 30, 2013 原文:argparse – Command line option and argument parsing 译者:young ...
- ArcGIS: version not specified. You must call RuntimeManager.Bind before creat
打开program.cs把ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);这句放到Applicatio ...
- Android 自学之滚动视图ScrollView
滚动视图ScrollView由FarmeLayout派生而出,他就是一个用于为普通组件添加垂直滚动条的组件:ScrollView里面最多包含一个组件,而ScrollView的作用就是为该组件添加一个垂 ...
- js 重庆38区县 数组
data:[ {name: '九龙坡区', value: 20057}, {name: '渝北区', value: 27}, {name: '渝中区', value: 27}, {name: '万州区 ...
- Ehcache(2.9.x) - API Developer Guide, Searching a Cache
About Searching The Search API allows you to execute arbitrarily complex queries against caches. The ...
- sql常识-Join
SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据. Join 和 Key 有时为了得到完整的结果,我们需要从两个或更多的表中获取结果.我们就需要执行 join. 数据库中的表 ...
- SQL_从星期一到星期六自动打卡SQL代码
create proc sp_MarkAutoKQ as begin ) ---创建两个变量,接收当前时间和当天是星期几 set @dateA=getdate() ---获取当前时间 set @dat ...
- hive 未初始化元数据库报错
启动hive-metastore和hive-server2 用beeline连接hive报错 [root@node04 hive]# beeline Beeline version 0.13.1-cd ...
- SQL Server的三种物理连接之Hash Join(三)
简介 在 SQL Server 2012 在一些特殊的例子下会看到下面的图标: Hash Join分为两个阶段,分别为生成和探测阶段. 首先是生成阶段,将输入源中的每一个条目经过散列函数的计算都放到不 ...