IPC——匿名管道
Linux进程间通信——使用匿名管道
#include <stdio.h>
FILE* popen (const char *command, const char *open_mode);
int pclose(FILE *stream_to_close);
如果type是“w”,则是文件指针是可写的,向这个流 的 写入被转化为 对 command 命令的标准输入;而 command 命令的 标准输出 则是和 调用 popen(), 函数 的 进程 相同,除非 这个被command命令 自己改变. 相反的, 如果type是“r”,则返回的文件指针是可读的,读取 一个 “被popen了的” 流, 就相当于 读取 command 命令的标准输出, 而 command 的标准输入 则是和 调用 popen, 函数的进程 相同.
注意, popen 函数的 输出流默认是被全缓冲的.
pclose 函数 等待 相关的进程结束并返回 一个 command 命令的 退出状态, 就像 wait4 函数 一样
函数popen先执行fork,然后调用exec以执行cmdstring,并且返回一个标准I/O文件指针。如果type是“r”,则文件指针连接到cmdstring的标准输出(见图15-5)。

fp相当于管道的fd[0], stdout相当于管道的fd[1].
图15-5 执行fp = popen(cmdstring, “r”)函数的结果
如果type是“w”,则文件指针连接到cmdstring的标准输入(见图15-6)。

fp相当于管道的fd[1], stdin相当于管道的fd[0].
图15-6 执行fp = popen(cmdstring, “w”)函数的结果
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h> int main()
{
FILE *read_fp = NULL;
FILE *write_fp = NULL;
char buffer[BUFSIZ + ];
int chars_read = ; //初始化缓冲区
memset(buffer, '\0', sizeof(buffer));
//打开ls和grep进程
read_fp = popen("ls -l", "r");
write_fp = popen("grep rwxrwxr-x", "w");
//两个进程都打开成功
if(read_fp && write_fp)
{
//读取一个数据块
chars_read = fread(buffer, sizeof(char), BUFSIZ, read_fp);
while(chars_read > )
{
buffer[chars_read] = '\0';
//把数据写入grep进程
fwrite(buffer, sizeof(char), chars_read, write_fp);
//还有数据可读,循环读取数据,直到读完所有数据
chars_read = fread(buffer, sizeof(char), BUFSIZ, read_fp);
}
//关闭文件流
pclose(read_fp);
pclose(write_fp);
exit(EXIT_SUCCESS);
}
exit(EXIT_FAILURE);
}

#include <unistd.h>
int pipe(int file_descriptor[]);
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h> int main()
{
int data_processed = ;
int filedes[];
const char data[] = "Hello pipe!";
char buffer[BUFSIZ + ];
pid_t pid;
//清空缓冲区
memset(buffer, '\0', sizeof(buffer)); if(pipe(filedes) == )
{
//创建管道成功
//通过调用fork创建子进程
pid = fork();
if(pid == -)
{
fprintf(stderr, "Fork failure");
exit(EXIT_FAILURE);
}
if(pid == )
{
//子进程中
//读取数据
data_processed = read(filedes[], buffer, BUFSIZ);
printf("Read %d bytes: %s\n", data_processed, buffer);
exit(EXIT_SUCCESS);
}
else
{
//父进程中
//写数据
data_processed = write(filedes[], data, strlen(data));
printf("Wrote %d bytes: %s\n", data_processed, data);
//休眠2秒,主要是为了等子进程先结束,这样做也只是纯粹为了输出好看而已
//父进程其实没有必要等等子进程结束
sleep();
exit(EXIT_SUCCESS);
}
}
exit(EXIT_FAILURE);
}

#include <unistd.h>
int dup(int file_descriptor);
int dup2(int file_descriptor_one, int file_descriptor_two);
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h> int main()
{
int data_processed = ;
int pipes[];
const char data[] = "";
pid_t pid; if(pipe(pipes) == )
{
pid = fork();
if(pid == -)
{
fprintf(stderr, "Fork failure!\n");
exit(EXIT_FAILURE);
}
if(pid == )
{
//子进程中
//使标准输入指向fildes[0],以后对标准输入的操作都是对管道的pips[0]的操作
close();
dup(pipes[]);
//关闭pipes[0]和pipes[1],只剩下标准输入
close(pipes[]);
close(pipes[]);
//启动新进程od
execlp("od", "od", "-c", );
exit(EXIT_FAILURE);
}
else
{
//关闭pipes[0],因为父进程不用读取数据
close(pipes[]);
data_processed = write(pipes[], data, strlen(data));
//写完数据后,关闭pipes[1]
close(pipes[]);
printf("%d - Wrote %d bytes\n", getpid(), data_processed);
}
}
exit(EXIT_SUCCESS);
}

IPC——匿名管道的更多相关文章
- linux的IPC进程通信方式-匿名管道(一)
linux的IPC进程通信-匿名管道 什么是管道 如果你使用过Linux的命令,那么对于管道这个名词你一定不会感觉到陌生,因为我们通常通过符号"|"来使用管道,但是管道的真正定义是 ...
- 进程间通信(IPC)-管道、匿名管道
每个进程都有各自的地址空间,任何一个进程的全局变量在另一个进程中都看不到 所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读 ...
- 进程通信类型 管道是Linux支持的最初Unix IPC形式之一 命名管道 匿名管道
管道 Linux环境进程间通信(一) https://www.ibm.com/developerworks/cn/linux/l-ipc/part1/index.html 管道及有名管道 郑彦兴200 ...
- Linux - 进程间通信 - 匿名管道
一.概念:进程间通信( IPC,InterProcess Communication) 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进城之间要交换数据必须通过内 ...
- 【Linux 应用编程】进程管理 - 进程间通信IPC之管道 pipe 和 FIFO
IPC(InterProcess Communication,进程间通信)是进程中的重要概念.Linux 进程之间常用的通信方式有: 文件:简单,低效,需要代码控制同步 管道:使用简单,默认阻塞 匿名 ...
- shell 匿名管道和命名管道
管道的特点:如果管道中没有数据,那么取管道数据的操作就会滞留,直到管道内进入数据,然后读出后才会终止这一操作:同理,写入管道的操作如果没有读取管道的操作,这一动作也会滞留. 1,匿名管道 匿名管道使用 ...
- Linux系统编程之匿名管道
1.进程间通信介绍 1.1 进程通信的基本概念 在之前我们已经学习过进程地址空间.Linux 环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间.任何一个进程的全局变量在另一个进程中都看不 ...
- Linux学习笔记(12)-进程间通信|匿名管道
Linux的进程间通信有几种方式,包括,管道,信号,信号灯,共享内存,消息队列和套接字等-- 现在一个个的开始学习! ----------------------------------------- ...
- Linux进程间通信(三):匿名管道 popen()、pclose()、pipe()、close()、dup()、dup2()
在前面,介绍了一种进程间的通信方式:使用信号,我们创建通知事件,并通过它引起响应,但传递的信息只是一个信号值.这里将介绍另一种进程间通信的方式——匿名管道,通过它进程间可以交换更多有用的数据. 一.什 ...
随机推荐
- Eclipse中用Link方式安装Maven插件(转载)
标签: it 分类: 开发软件 1.工具下载: Eclipse4.2 jee版本(注意是Jee,不是标准版的eclipse) 下载地址:http://www.eclipse.org/downloads ...
- Mapreduce读取Hbase表,写数据到多个Hbase表中
Job端的变化: 通过设置conf,配置输出表,在reduce中获取输出表名字 Configuration conf = job.getConfiguration(); //输出表1 conf.set ...
- jsp界面项目绝对路径问题
方法一:直接采用绝对路径 (不推荐) 在JSP页面端,获得本项目的绝对地址(如果你的项目叫MyApp,那么获得到的地址就是 http://localhost:8080/MyApp/): 代码如下: & ...
- quartz 的job中获取到applicationContext
第一步: 定义SchedulerFactoryBean的applicationContextSchedulerContextKey <bean name="scheduler" ...
- HDU 1242 Rescue (BFS(广度优先搜索))
Rescue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- HDU 5164Matching on Array(AC自动机)
这是BC上的一道题,当时比赛没有做,回头看看题解,说是AC自动机,想着没有写过AC自动机,于是便试着抄抄白书的模板,硬是搞了我数个小时2000ms时限1800过了= = ! 这里就直接贴上BC的结题报 ...
- thinkphp过滤html、script
使用tp3.1版本 1.APP/common 自定义函数 function filter_default(&$value){ $value = htmlspecialchars($value) ...
- iOS Ping++前端集成支付
直接上代码 /* 获取订单charge 1.buyerId 买家ID 2.sellerId 卖家ID 3.liveId 直播间ID 4.goodCount 商品数量 5.status ...
- php获取GET方式传入的全部变量名称与值:foreach用法
$count = count($_GET); $i = 0; foreach ($_GET as $key => $value) { if ($i == $count - 1) { $str . ...
- sc7731 Android 5.1 LCD驱动简明笔记之一
基于展讯sc7731 - Android 5.1 代码分析浏览.将屏蔽细节,把握整体,并且不涉及其他设备和LCD的交互. 以下对sc7731 lcd大体流程进行简要说明. 第一,lcd 的两个阶段 1 ...