1.标准流管道

管道操作支持文件流模式,用来创建链接还有一个进程的管道,通过函数popen和pclose
popen的详细介绍在本blog:Linux
多进程学习
中有具体介绍

2.无名管道(PIPE)

特点:
1)仅仅能在亲缘关系进程间通信(父子或兄弟)
2)半双工(固定的读端和固定的写端)
3)是特殊文件,能够用read,write等,在内存中
管道函数原型:
#include<unistd.h>
int pipe(int fds[2]);
管道在程序中用一对文件描写叙述符表示,一个是可读属性,一个是可写属性:fds[0]读,fds[1]写
两个进程必须有继承关系,才干继承这对打开的文件描写叙述符

int main(){
int fds[2];
if(pipe(fds)==-1){
perror("pipe:");
return 0;
}
char buf[1024]="";
if(fork()==0){
close(fds[1]);
while(memset(buf,0,sizeof(buf))){
if(read(fds[0],buf,1024)==0){//当管道里没有数据的时候就退出
break;
}
printf("child:read:");
puts(buf);
}
exit(1);
}
else{
close(fds[0]);
// char p[1024];
// char *p="Hello world!";
while(memset(buf,0,1024),fgets(buf,1024,stdin)!=NULL)
write(fds[1],buf,1024);
close(fds[1]);
printf("parents,finish\n");
wait(NULL);//wait一定要放在close的后面,由于仅仅有先将父进程的fds[1]关掉,当子进程没有数据读的时候才会退出,否则会导致死锁
}
}

3命名管道(FIFO)

无名管道仅仅能在亲缘关系的进程间通信大大限制的管道的使用,有名管道突破了这个限制,通过制定路径名的范式实现不相关的进程通信

3.1创建,删除FIFO文件

创建FIFO文件与创建普通文件非常类似,仅仅是创建之后的文件FIFO
创建FIFO文件的函数原型
#include<sys/types.h>
#include<sys/stat.h>
int mkfifo(const char *pathname,mode_t mode);
參数pathname为要创建的FIFO文件的全路径名;
參数mode为文件的訪问权限
创建成功返回0,创建失败为-1
删除FIFO文件的函数原型为
int unlink(const char *pathname);
样例:
#include<iostream>
using namespace std;
int main(int argc,char *argv[]){
if(mkfifo(argv[1],0666)==-1){
perror("ew");
return 0;
}
unlink(argv[1]);
}

3.2打开,关闭FIFO文件

对于FIFO类型的文件的打开/关闭更普通文件一样,都是用open和close函数。用O_WRONLY打开FIFO的写入端,用O_RDONLY选项,则打开FIFO的读入端,写入读入端都能够被几个进程同一时候打开。

fd_recv=open(argv[1],O_RDONLY);

fd_send=open(argv[2],O_WRONLY);

if(fd_send==-1){

perror("fd_send");

exit(1);

}


3.3读写FIFO

读:
fd_recv=open(argv[1],O_RDONLY);
char buf_recv[1024]="";
if(read(fd_recv,buf_recv,1024)!=0)   write(1,buf_recv,strlen(buf_recv));
close (fd_recv)
写:
fd_send=open(argv[2],O_WRONLY);
char buf_send[1024]="";
if(fgets(buf_send,1024,stdin)!=NULL) write(fp_send,buf_send,strlen(buf_send));
close(fd_send);
程序示范:
pork_send.c与pork_recv.c聊天
使用fork开辟留一个进程,两个程序能够进行聊天功能

/*************************************************************************
> File Name: pork_send.c
> Author: yang
> Mail:826123027@qq.com
> Created Time: 2014年08月22日 星期五 19:54:08
************************************************************************/ #include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<memory.h>
int main(int argc,char *argv[]){
if(mkfifo(argv[1],0666)==-1){
perror("mkfifo1");
exit(1);
}
int fd_send,fd_recv;
fd_send=open(argv[1],O_WRONLY);
fd_recv=open(argv[2],O_RDONLY);
char buf_recv[1024]="";
char buf_send[1024]="";
printf("opening!\n");
if(fork()==0){//开皮一个进程,用来接受信息
close(fd_send);
while(memset(buf_recv,0,sizeof(buf_recv)),read(fd_recv,buf_recv,1024)>0){
write(1,buf_recv,strlen(buf_recv));
}
close(fd_recv);
exit(1);
}
close(fd_recv);
while(memset(buf_send,0,sizeof(buf_send)),fgets(buf_send,1024,stdin)!=NULL){
write(fd_send,buf_send,strlen(buf_send));//用来发送信息
}
close(fd_send);
wait(NULL);
}
/*************************************************************************
> File Name: pork_recv.c
> Author: yang
> Mail:826123027@qq.com
> Created Time: 2014年08月22日 星期五 20:12:32
************************************************************************/ #include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<memory.h>
#include<stdio.h>
int main(int argc,char *argv[]){
if(mkfifo(argv[2],0666)==-1){
perror("mkfifo2");
exit(1);
}
int fd_send,fd_recv;
fd_recv=open(argv[1],O_RDONLY);//注意这里与上面程序的这个位置有所不一样
fd_send=open(argv[2],O_WRONLY);
char buf_recv[1024]="";
char buf_send[1024]="";
printf("opening!\n");
if(fork()==0){//接受信息
close(fd_send);
while(memset(buf_recv,0,sizeof(buf_recv)),read(fd_recv,buf_recv,1024)>0){
write(1,buf_recv,strlen(buf_recv));
}
close(fd_recv);
exit(1);
}
close(fd_recv);//发送信息
while(memset(buf_send,0,sizeof(buf_send)),fgets(buf_send,1024,stdin)!=NULL){
write(fd_send,buf_send,strlen(buf_send));
}
close(fd_send);
wait(NULL);
}






Linux IPC(Inter-Process Communication,进程间通信)之管道学习的更多相关文章

  1. Linux进程间通信之管道

    1,进程间通信 (IPC ) Inter-Process Communication 比较好理解概念的就是进程间通信就是在不同进程之间传播或交换信息. 2,linux下IPC机制的分类:管道.信号.共 ...

  2. linux内核剖析(八)进程间通信之-管道

    管道 管道是一种两个进程间进行单向通信的机制. 因为管道传递数据的单向性,管道又称为半双工管道. 管道的这一特点决定了器使用的局限性.管道是Linux支持的最初Unix IPC形式之一,具有以下特点: ...

  3. Linux进程间通信(一) - 管道

    管道(pipe) 普通的Linux shell都允许重定向,而重定向使用的就是管道. 例如:ps | grep vsftpd .管道是单向的.先进先出的.无结构的.固定大小的字节流,它把一个进程的标准 ...

  4. linux IPC总结——管道

    管道 管道是unix ipc的最古老形式,是一种在内存中的特殊文件,只能在具有公共祖先的进程之间使用(即父子进程,兄弟进程). 管道由pipe函数创建 #include <unistd.h> ...

  5. 【IPC第二个进程间通信】管道Pipe

    IPC进程间通信+管道Pipe                IPC(Inter-Process Communication,进程间通信).         管道用于进程间共享数据,事实上质是共享内存 ...

  6. Linux - 进程间通信 - 匿名管道

    一.概念:进程间通信( IPC,InterProcess Communication) 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进城之间要交换数据必须通过内 ...

  7. Linux 进程间通信之管道(pipe),(fifo)

     无名管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信: 定义函数: int pipe(int f ...

  8. IPC 进程间通信方式——管道

    进程间通信概述 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间 共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到. 通知时间: ...

  9. Linux IPC实践(1) -- 概述

    进程的同步与互斥 进程同步: 多个进程需要相互配合共同完成一项任务. 进程互斥: 由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为进程的互斥;系统中某些 ...

随机推荐

  1. bridge pattern

     10.5 桥接模式总结 桥接模式是设计Java虚拟机和实现JDBC等驱动程序的核心模式之一,应用较为广泛.在软件开发中如果一个类或一个系统有多个变化维度时,都可以尝试使用桥接模式对其进行设计.桥接模 ...

  2. 修改系统启动项 grub2配置的方法 ubuntu[转]

    在 早期的Ubuntu中,使用Grub作为系统的启动引导程序,想修改系统启动项非常简单,只要用gedit打开系统菜单设定文件( sudo gedit /boot/grub/menu.lst ),修改该 ...

  3. 玩转Web之Json(四)---json与(Object/List/Map)的相互转化

    在做web应用时,经常需要将json转化成Object/list/map或者将Object/List/map转化成json,通过简单封装可以在写代码是减轻很多负担.本文将给出json转化的一系列方法. ...

  4. 模板引擎mustache.js

    Javascript模板引擎mustache.js详解   阅读目录 1. 从一个简单真实的需求讲起 2. mustache的用法 3. mustache的思想 4. {{prop}}标签 5. {{ ...

  5. java基础程序题

    发现自己初学java时保存在word里的练习题,哈哈,放博客里面来作为纪念吧~~~ [程序1]  题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔 ...

  6. C++包括头文件&lt;&gt;和&quot;&quot;差额

    #include "book.h" #include<iostream.h> 在刚開始学习都会有这样的迷惑.有的程序用<>.有的却用"" ...

  7. OpenJDK 阅读源代码 Java 实现字节流输入类

    Java 的输入输出总是给人一种非常混乱的感觉.要想把这个问题搞清楚.必须对各种与输入输出相关的类之间的关系有所了解. 仅仅有你了解了他们之间的关系.知道设计这个类的目的是什么.才干更从容的使用他们. ...

  8. 每位iOS开发人员不容错过的10大实用工具

    内容简介 1.iOS简介 2.iOS开发十大实用工具之开发环境 3.iOS开发十大实用工具之图标设计 4.iOS开发十大实用工具之原型设计 5.iOS开发十大实用工具之演示工具 6.iOS开发十大实用 ...

  9. NET开发者部署React-Native

    NET开发者部署React-Native 前情摘要 众所周知,有人说.net可以用Xamrian,呵呵,不习惯收费的好么?搞.Net的人设置一次java的环境变量,可能都觉得实在太麻烦了,可能是因为这 ...

  10. android ListView优化

    android ListView通过优化重用历史缓存实现.listview相应的数据适配器一般使用自己定义BaseAdapter子类,重用历史缓冲区来提高性能. 例如,下面的示例代码演示: 1.lis ...