LINUX学习笔记12——进程间通信1管道


1.         概述:
 
a)         为什么进程间通信:数据传输;资源共享;通知事件;进程控制;
 
b)         基础来源:
 
1.         UNIX进程间通信:
 
2.         基于system v 进程间通信:
 
a)         system v:UNIX操作系统接口的一个分支
 
3.         Posix 进程间通信:
 
a)         Posix:可移植操作系统接口
 
c)         分类:管道;信号;消息队列;共享内存;信号量;套接字
 
2.         管道通信:
 
a)         特点:
 
1.         单向,先进先出
 
2.         写入:在管道的尾部
 
3.         读:在管道的头部
 
b)         分类:
 
1.         无名管道:用于父进程和子进程间的通信
 
2.         有名管道:用于任意两个进程间的通信
 
c)         无名管道:
 
1.         创建管道:Int pipe(int filedis[2]);
 
a)         Filedis[0]:用于读管道,文件描述符,创建管道后生成
 
b)         Filedis[1]:用于写管道
 
c)         返回值:成功为0,失败为-1
 
d)         #include <unistd.h>
 
2.         关闭管道:close(filedis[0]); close(filedis[1]);
 
3.         注意:
 
a)         必须在调用fork()之前调用pipe(),否则子进程将不会继承文件描述符
 
b)         创建子进程后需要把没用到的端口关掉。
 
c)         为了能够正常读写,读的进程需要先等待一段时间,让写的进程能够有时间写入数据。
 
4.         写入管道:write(filedis[1],”字符串”, sizeof(s));
 
5.         读取管道:read(filedes[0],buffer,80);
 
a)         把数据存在buffer数组中,80是buffer的长度
 
d)         有名管道:
 
1.         本质:是一个文件
 
2.         创建管道:Int mkfifo(const char * pathname, mode_t mode);
 
a)         If((mkfifo(pathname,O_CREAT|O_EXCL)<0)&&(errno!=EEXIST))
 
b)         pathname:文件名
 
c)         mode:文件权限,一旦创建了就可用文件编程
 
d)         返回值:成功为0,失败为-1
 
e)         #include<sys/types.h>
 
#include<sys/stat.h>
 
3.         关闭文件:unlink(const char * pathname);
 
4.         文件打开:Int open(const char *pathname, int flags, [mode])
 
a)         Fd=open(pathname,O_RDONLY|O_NONBLOCK)
 
b)         Pathname:需要完整的路径
 
c)         非阻塞标志:O_NONBLOCK
 
1.         没有使用:访问无法满足要求时进程将阻塞。
 
2.         使用:访问无法满足要求时进程不阻塞,立刻出错返回,errno 是ENXIO
 
5.         写入管道:write(fd, ”字符串”, sizeof(s));
 
6.         读取管道:read(fd, buffer,80);
 
a)         把数据存在buffer数组中,80是buffer的长度
 
b)         记得每次读数据前清空buffer里的内容memset(buffer, 0, 80),  #include<string.h>
 
c)         Buffer应该是字符串形式的
 
7.         注意:
 
a)         管道里的数据被读一次就没有了
 
b)         管道一般由读数据的进程来创建和关闭。

相关内容

    暂无相关文章