【APUE】进程间通信之管道
管道是UNIX系统IPC最古老形式,并且所有UNIX系统都提供此种通信机制。管道由下面两种局限性:
1)历史上,它们是半双工的(即数据只能在一个方向上流动)
2)它们只能在具有公共祖先的进程之间使用。通常,一个管道由一个进程创建,然后该进程调用fork,此后父、子进程之间就可应用该管道
管道由调用pipe函数创建:
#include <unistd.h>
int pipe(int filedes[2]);//若成功则返回0,出错返回-1
注意:filedes[0]为读而打开,filedes[1]为写而打开,filedes[1]的输出是fileds[0]的输入
单个进程中的管道几乎没有任何作用。通常,调用pipe的进程接着调用fork,这样就创建了从父进程到子进程(或反向)的IPC通道。
调用fork后做什么取决于我们想要有的数据流的方向。对于从父进程到子进程的管道,父进程关闭管道的读端(fd[0]),子进程则关闭写端(fd[1]).
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#define MAXLINE 100
//经由管道父进程向子进程传送数据
int main()
{
int n;
int fd[];
pid_t pid;
char line[MAXLINE]; if(pipe(fd)<)
printf("pipe error");
if((pid=fork())<)
printf("fork error");
else if(pid>)
{
close(fd[]);
write(fd[],"hello world\n",);
}
else
{
close(fd[]);
n=read(fd[],line,MAXLINE);
write(STDOUT_FILENO,line,n);
}
exit();
}
采用管道实现双向通信需要两个管道,控制两个不同的数据流向。现在模拟一个Client和Server双向通信的过程,Client与Server之间 可以相互发送和接收信息。此时需要两个管道进行模拟,管道1模拟Server写Client读数据流向,管道2模拟Client写Server读数据流 向。代码如下所示:
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<errno.h>
#include<string.h> int main()
{
int fd1[],fd2[];
pid_t childpid;
char buf[]; memset(buf,,); if(pipe(fd1)==-)
{
perror("pipe()error");
exit(-);
}
if(pipe(fd2)==-)
{
perror("pipe() error");
exit(-);
}
childpid=fork();
if(childpid==)
{
printf("server input a message:");
gets(buf);
close(fd1[]);
close(fd2[]);
write(fd1[],buf,strlen(buf));
read(fd2[],buf,);
printf("server received message from client:%s\n",buf);
exit();
}
if(childpid==-)
{
perror("fork()error");
exit(-);
}
close(fd1[]);
close(fd2[]);
read(fd1[],buf,);
printf("client received a message from server:%s\n",buf);
printf("client input a message:");
gets(buf);
write(fd2[],buf,strlen(buf));
waitpid(childpid,NULL,);
return ;
}
【APUE】进程间通信之管道的更多相关文章
- linux内核剖析(八)进程间通信之-管道
管道 管道是一种两个进程间进行单向通信的机制. 因为管道传递数据的单向性,管道又称为半双工管道. 管道的这一特点决定了器使用的局限性.管道是Linux支持的最初Unix IPC形式之一,具有以下特点: ...
- IPC 进程间通信方式——管道
进程间通信概述 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间 共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到. 通知时间: ...
- Linux学习笔记(12)-进程间通信|匿名管道
Linux的进程间通信有几种方式,包括,管道,信号,信号灯,共享内存,消息队列和套接字等-- 现在一个个的开始学习! ----------------------------------------- ...
- Linux进程间通信之管道
1,进程间通信 (IPC ) Inter-Process Communication 比较好理解概念的就是进程间通信就是在不同进程之间传播或交换信息. 2,linux下IPC机制的分类:管道.信号.共 ...
- Linux 进程间通信(二) 管道
Linux 进程间通信-管道 进程是一个独立的资源分配单位,不同进程之间的资源是相互独立的,没有关联,不能在一个进程中直接访问另一个进程中的资源.但是,进程不是孤立的,不同的进程之间需要信息的交换以及 ...
- 《Linux程序设计》--读书笔记---第十三章进程间通信:管道
管道:进程可以通过它交换更有用的数据. 我们通常是把一个进程的输出通过管道连接到另一个进程的输入: 对shell命令来说,命令的连接是通过管道字符来完成的: cmd1 | cmd2 sh ...
- Linux进程间通信-命名管道
前面我们讲了进程间通信的一种方式,匿名管道.我们知道,匿名管道只能用于父子关系的进程之间.那么没有这种关系的进程之间该如何进行数据传递呢? 1.什么是命名管道 匿名管道是在缓存中开辟的输出和输入文件流 ...
- Linux进程间通信-匿名管道
前面我们讲了进程间通信的一种方式,共享内存.下面看一看另一种机制,匿名管道.1.什么是管道管道是一个进程的数据流到另一个进程的通道,即一个进程的数据输出作为另一个进程的数据输入,管道起到了桥梁的作用. ...
- 进程间通信之管道(pipe、fifo)
我们先来说说进程间通信(IPC)的一般目的,大概有数据传输.共享数据.通知事件.资源共享和进程控制等.但是我们知道,对于每一个进程来说这个进程看到属于它的一块内存资源,这块资源是它所独占的,所以进程之 ...
随机推荐
- js数组常用方法整理
学疏才浅,若有不对的地方,希望大家可以帮忙指正出来. 1. Array.push(),向数组的末尾添加一个或多个元素,并返回新的数组长度.原数组改变. 2. Array.pop(),删除并返回数组的最 ...
- vue $parent 的上一级 有可能不是父组件,需要好几层$parent 如果这样 还不如用 this.$emit
vue $parent 的上一级 有可能不是父组件,需要好几层$parent 如果这样 还不如用 this.$emit
- js 数组元素排序?
Part.1 sort 方法 js 有自带排序方法 sort(), 默认 升序 排列 如: data() { return { arr: [1,3,2,5,6,8,7,4,9] } }, 控制台如 ...
- Caused by: java.lang.ClassNotFoundException: Cannot find class: User
源代码: <select id="selectAll" resultType="User"> select user_id uid,user_nam ...
- 使用plsql导入dmp文件缺少imp*.exe
在C:\app\Administrator\product\11.2.0\client_2\BIN 找到imp.exe 导入
- 关于U盘安装ubuntu-18.04安装时候出现的grub-efi-amd64-signed的问题。
关于这个问题,首先我们要查看一下我们电脑的主板设置中U盘启动的类型是什么,是UEFI还是legacy? 对于如果是UEFI那么给ubuntu分区的时候不用设置/boot分区,设置efi系统分区:如果是 ...
- 如何实时查看mysql当前连接数?
1.查看当前所有连接的详细资料: ./mysqladmin -uadmin -p -h10.140.1.1 processlist2.只查看当前连接数(Threads就是连接数.): ./mysqla ...
- java多线程之ForkJoinPool
转https://www.cnblogs.com/lixuwu/p/7979480.html 阅读目录 使用 背景:ForkJoinPool的优势在于,可以充分利用多cpu,多核cpu的优势,把一个任 ...
- hdu 6201 transaction (最短路变形——带负权最长路)
题意: 给定n个城市的货物买卖价格, 然后给定n-1条道路,每条路有不同的路费, 求出从某两个城市买卖一次的最大利润. 利润 = 卖价 - (买价 + 路费) 样例数据, 最近是从第一个点买入, 第4 ...
- WebStorm下载安装
下载地址:https://www.jetbrains.com/webstorm/ 注册码: http://idea.codebeta.cn