父子进程间通信模型实现(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函数创建的子进程 ...
随机推荐
- Android 高级UI设计笔记08:Android开发者常用的7款Android UI组件(转载)
Android开发是目前最热门的移动开发技术之一,随着开发者的不断努力和Android社区的进步,Android开发技术已经日趋成熟,当然,在Android开源社区中也涌现了很多不错的开源UI项目,它 ...
- .net 在不同情况下调用带soapheader的webservice的方式
国庆长假到了,本想出去玩玩,无奈自己屌丝一枚,啥都没有,只能自己宅在家里思考思考人生.不过人生还是过于复杂,一时间也想不出个所以然,只能是整理一下在工作中遇到的一些小问题,首先是关于带soaphead ...
- Log4Net之初步了解
原创文章,转载必需注明出处:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/log4net%E4%B9%8B%E5%88%9D%E6 ...
- shareplex的安装&&起停服务(添加新用户)
一.主机环境 主从类型 系统版本 数据库版本 主机地址 主机名 源数据库 Centos6.4 X86_64 11.2.0.4.0 192.168.3.230 dbshareplex 目的数据库 C ...
- CF Tavas and Nafas
Tavas and Nafas time limit per test 1 second memory limit per test 256 megabytes input standard inp ...
- Linux 命令 - crontab: 任务调度
cron 是一个 Linux 下的定时执行工具,可以在无需人工干预的情况下运行作业.守护进程 cron 会读取 crontab 文件,根据配置在指定的时间执行任务.contab 命令用来添加.删除.显 ...
- 【转】C#绝对新手之C#中的多线程小结
大概有4种方法: Dispatcher.异步委托.手动多线程.BackgroundWorker,另外还有一个DispatcherTimer,是定时器. 其中Dispatcher与DispatcherT ...
- OC7_单词个数
// // WordManger.h // OC7_单词个数 // // Created by zhangxueming on 15/6/17. // Copyright (c) 2015年 zhan ...
- LINQ(隐式表达式、lambda 表达式)
.NET 中一项突破性的创新是 LINQ(Language Integrated Query,语言集成查询),这组语言扩展让你能够不必离开舒适的 C# 语言执行查询. LINQ 定义了用于构建查询表达 ...
- Android的selector,背景选择器
原文地址 http://android.blog.51cto.com/268543/564581 首先android的selector是在drawable/xxx.xml中配置的,相关图片放在同目录下 ...