灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2141回复:0

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

楼主#
更多 发布于:2012-08-27 14:50

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)         管道一般由读数据的进程来创建和关闭。

喜欢0 评分0
游客

返回顶部