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)的更多相关文章

  1. swoole 父子进程间通信

    <?php /** * 场景: * 监控订单表状态 父子进程通信 * 一个主进程 两个子进程实现 */ //设置主进程名 echo '主进程id:' . posix_getpid() . PHP ...

  2. 19重定向管道与popen模型

    重定向 dup2 int dup(int fd) 重定向文件描述符  int newFd = dup(STDOUT_FILENO) newFd 指向 stdout int dup2(int fd1, ...

  3. linux下代替system的基于管道的popen和pclose函数

    linux下使用system需要谨慎,那么代替它的方法是什么呢? 标准I/O函数库提供了popen函数,它启动另外一个进程去执行一个shell命令行. 这里我们称调用popen的进程为父进程,由pop ...

  4. Python多进程(1)——subprocess与Popen()

    Python多进程方面涉及的模块主要包括: subprocess:可以在当前程序中执行其他程序或命令: mmap:提供一种基于内存的进程间通信机制: multiprocessing:提供支持多处理器技 ...

  5. Nginx学习之六-nginx核心进程模型

    一.Nginx整体架构 正常执行中的nginx会有多个进程,最基本的有master process(监控进程,也叫做主进程)和woker process(工作进程),还可能有cache相关进程. 一个 ...

  6. 【IPC通信】基于管道的popen和pclose函数

    http://my.oschina.net/renhc/blog/35116 [IPC通信]基于管道的popen和pclose函数 恋恋美食  恋恋美食 发布时间: 2011/11/12 23:20 ...

  7. 最快的进程间通信方式你get了么

    前言:天下武功为快不破!在信息爆炸.快速发展的新时代...,扯远了....进程间通信方式有很多,但最快的方式你知道么?由我娓娓道来... 一.共享内存方式 主角闪亮登场了,噔噔瞪...,最快的方式就是 ...

  8. 进程间通信IPC (InterProcess Communication)

    一.进程间通信的概念 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区, ...

  9. TCP/IP网络编程之进程间通信

    进程间通信基本概念 进程间通信意味着两个不同进程间可以交换数据,为了完成这一点,操作系统中应提供两个进程可以同时访问的内存空间.但我们知道,进程具有完全独立的内存结构,就连通过fork函数创建的子进程 ...

随机推荐

  1. 以WCF安全认证方式调用通用权限管理系统获取基础信息资料

    在B/S开发中,涉及到获取系统基础资料的问题,因为是在不同平台下的开发,采用了WCF方式获取. 下面是一个调用通用权限管理系统(吉日嘎拉)基础信息资料的一个demo供参考 调用原理图: web.con ...

  2. LeetCode 283

    Move Zeros Given an array nums, write a function to move all 0's to the end of it while maintaining ...

  3. 修改Linux网卡由eth1变成eth0

    正常来说,Linux在识别网卡时第一张会是eth0,第二张才是eth1.有时候我们使用虚拟机克隆技术后网卡的信息就会改变,新克隆出来的虚拟主机网卡名字可能变为eth1.无论我们怎么修改都无法改变,这就 ...

  4. 转:linux的源码查看, c++语法 查看网站

    http://linux.die.net/ http://www.cplusplus.com/

  5. asp.net下的b/s架构

    最近一直在做asp.net下的b/s架构的程序.整理一下可以采用的架构. 简单三层架构 基于接口和工厂模式的三层 前台用jquery调用http请求(ashx),ashx再调用逻辑接口 虽然很早就知道 ...

  6. Linux 命令 - cat: 合并文件至标准输出

    命令格式 cat [OPTION]... [FILE]... 命令参数 -A, --show-all 等价于 -vET. -b, --number-nonblank 对非空输出行编号. -e 等价于 ...

  7. Eclipse配置安卓开发环境(解决SDK manager下载慢问题)

    Android新手在eclipse搭建安卓开发环境基本都会遇到Android SDK manager下载慢,ADT下载慢的问题,本文将带大家完整的安装一遍开发环境 工具:eclipse     SDK ...

  8. Android第三方授权(QQ篇)

    QQ授权比微信授权相对来说会方便一些 同样需要去官网下载sdk和导入sdk到自己的工程 http://wiki.connect.qq.com/%E7%A7%BB%E5%8A%A8%E5%BA%94%E ...

  9. 如何找出MySQL数据库中的低效SQL语句

    面对业务的迅猛发展,DBA的一项重要工作就是及时发现数据库中的低效SQL语句,有的可以立刻着手解决(比如缺少合适的索引),有的需要尽快反馈给开发人员进行修改. MySQL数据库有几个配置选项可以帮助我 ...

  10. update更新多行数据(oracle)

    转自:http://blog.itpub.net/25322446/viewspace-767505 说明:笔记总结了在工作中遇到过的几种update方法和各种方法适用的范围. 1.单表更新方案:使用 ...