深圳知名网站设计公司排名企业网站网址
1.进程间通信实现方式
 【1】同一主机
   linux下通信方式:
   a.传统的进程间通信方式 
     管道   --- 进行数据传输的"管道"  
        无名管道 
        有名管道
     信号   --- 
       
   b.system v 进程间通信 
     (posix 进程间通信)    
    共享内存  (进程间 效率最高的通信方式)
    消息队列 
    信号量 
 【2】不同主机 
   socket --- 网络的方式实现 
   
 【3】进程间 实现 通信的 底层原理:
   进程间空间独立 
   如果要实现进程间通信,必须借助于内核 
   (内核也是在内存中运行的)
 
2.管道的定义,特性及分类
 【1】管道:
      1. 有数据的入口(写端) 有数据的出口 (读端)
      2. 数据从写端 流向 读端 
      3. FIFO  --- first in first out 
  
   【2】 管道==》无名管道、有名管道
    无名管道 ===》pipe ==》只能给有亲缘关系进程通信
     有名管道 ===》fifo ==》可以给任意单机进程通信(同一主机内)
     【3】管道的特性:
     1、管道是 半双工的工作模式
     2、所有的管道都是特殊的文件不支持定位操作。
        lseek->> fd  fseek ->>FILE* 
        数据流 --- FIFO(first in first out)
     3、管道是特殊文件,读写使用文件IO。
        fgets,fread,fgetc,
        open,read,write,close;

   
3. 流程:
     创建并打开管道: pipe函数
     #include <unistd.h>
     int pipe(int pipefd[2]);
     int pipe(int *pipefd);
     int fd[2];
     功能:创建并打开一个无名管道
     参数:pipefd[0] ==>无名管道的固定读端//0 -- 标准输入
           pipefd[1] ==>无名管道的固定写端//1 -- 标准输出 
     返回值:成功 0
             失败 -1;
    有了文件描述符之后,
     可以读写操作 
 

内核创建管道读写数据.
4.注意:
     1.管道 是有大小  
       64k 字节 
     2.读写规则 
       
       读端存在 ,写管道
         管道空 ,可以写
         管道满 ,写操作阻塞
       读端不存在,写管道 
         会出现 管道破裂 
         SIGPIPE, Broken pipe  --- 会杀死进程 
       写端存在 ,读管道
         如果管道中有数据,可以一直读
         如果没有数据,则读操作阻塞
       写端不存在 ,读管道
         如果管道中有数据,可以一直读
         如果没有数据,则读操作不阻塞,直接返回
     3.    定位不能做  lseek 
     4.  无名管道只能用于亲缘关系进程间  (有继承关系)

写端不存在,管内有数据
5.有名管道:
  
  有名管道===》fifo ==》有文件名称的管道。
                       文件系统中可见
框架:
     (1).创建有名管道 -- 类似 文件 (管道文件) 
     (2).打开有名管道 -- open 
     (3).读写管道     -- read/write 
     (4).关闭管道  ==》卸载有名管道 //close 

1、创建:mkfifo //创建了一个有名管道
 #include <sys/types.h>
 #include <sys/stat.h>
  remove();
int mkfifo(const char *pathname, mode_t mode);
 功能:
       在指定的pathname路径+名称下创建一个权限为
       mode的有名管道文件。
 参数:pathname要创建的有名管道路径+名称
       mode  8进制文件权限。
 返回值:成功 0
         失败  -1;
2、打开有名管道 open
     注意:
     
     该函数使用的时候要注意打开方式,
     因为管道是半双工模式,所有打开方式直接决定
     当前进程的读写方式。
     
     一般只有如下方式:
     int fd-read = open("./fifo",O_RDONLY); ==>fd 是固定读端
     int fd-write = open("./fifo",O_WRONLY); ==>fd 是固定写端
     不能是 O_RDWR 方式打开文件。
     不能有 O_CREAT 选项,因为创建管道有指定的mkfifo函数
     
     
     双工     ---发送和接收可以同时进行 --手机,电话
     半双工   ---发送端 和 接收端  同一个时刻之后有一个起效 ---对讲机 
     单工     ---发送端 接收端固定 --- 广播 
     
     
     
     
     
     有名管道打开:
     注意,
     如果一端是以只读,或者只写方式打开的。
     程序会阻塞,
     阻塞在打开操作。
     直到另一端,以只写或只读方式打开。
     
     A.c --- 只读 
     B.c --- 只写 
     
     注意:
        也可以以读写的方式打开,此时不阻塞 
        
     
     
3、管道的读写: 文件IO
    读: read(fd-read,buff,sizeof(buff));
     写: write(fd-write,buff,sizeof(buff));
4、关闭管道:
         close(fd);
5、卸载管道:remove();
         int unlink(const char *pathname);
         功能:将指定的pathname管道文件卸载,同时
               从文件系统中删除。
         参数: ptahtname 要卸载的有名管道 
         返回值:成功 0
                 失败  -1;


创建有名管道两文件进行通信
                 
  
