管道
管道的特性:
1、管道是 半双工的工作模式
2、所有的管道都是特殊的文件不支持定位操作。
lseek->> fd fseek ->>FILE*
3、管道是特殊文件,读写使用文件IO。
open,read,write,close;;
使用框架:
创建管道 ---- > 读写管道 —>关闭管道
有名管道
有名管道:同一主机下,任意两个进程间通信
1.创建管道文件 mkfifo
int mkfifo(const char *pathname, mode_t mode);
功能:在指定的pathname路径+名称下创建一个权限为
mode的有名管道文件。
参数:pathname要创建的有名管道路径+名称
mode 8进制文件权限。
返回值: 成功 0
失败 -1;
2.打开管道文件 open
以O_RDONLR打开时 ,管道在open处阻塞
以O_WRONLY打开时 ,管道在open处阻塞
当两端同时打开时,才解除阻塞
3.读写管道 read write
读: read(fd-read,buff,sizeof(buff));
写: write(fd-write,buff,sizeof(buff));
4.关闭管道 close
close(fd)
5.卸载管道 remove
remove();
int remove(const char *pathname);
功能:将指定的pathname管道文件卸载,同时
从文件系统中删除。
参数: ptahtname 要卸载的有名管道
返回值:成功 0
失败 -1;
无名管道
无名管道:
特性:
1.同一主机下,具有亲缘关系的进程间通信
2.有固定的读写端
1.创建并打开无名管道(创建时会自动打开)pipe函数
2.读写管道
3.关闭管道
管道默认大小64K
1.当读端和写端都存在时,如果管道中有数据,则读出,如果没有数据则等待
2.当写端都关闭时,读端不再阻塞,如果有数据,则读出数据,如果无数据,read直接返回0
3.读端都关闭,向管道中写入数据,发生管道破裂
4.当读端和写端都存在时,当管道满时,发生写阻塞
1.创建一个整型数组来存储管道的文件描述符
int pipefd[2];
2.创建管道 pipe;
int pipe(pipefd[2]);
功能:创建并打开一个无名管道
参数:
pipefd[0]:用于读数据的文件描述符
pipefd[1]:用于写数据的文件描述符
返回值:
成功: 0
失败: -1
无名管道的架设应该在fork之前进行
1.写阻塞:
管道中至少有一个读端:
写:
管道中缓存区没有存满则直接写入
管道中缓存区写满则阻塞等待直到有数据读出才能继续写入
2.读阻塞:
管道中至少有一个写端:
读:
有数据时直接读出
没有数据时阻塞等待直到有数据写入才能读出
3.管道破裂:
管道中没有读端,写入数据:
写:
会产生管道破裂信号SIGPIPE,进程异常结束
4.读到0返回:
管道中没有写端:
读:
有数据时直接读出
没有数据时不会阻塞等待直接返回,读到0
信号
信号(软中断):
进程间通知机制
异步通信
处理方式
1.忽略(不处理)
2.缺省(按照操作系统默认方式处理)
3.捕获(自定义方式处理)
1.信号的注册signal
1.能早注册尽可能早注册
2.如果信号不被注册,则会按照缺省类型
typedef void(*sighandler_t)(int);
sighandler_t signal(int signum,sighandler_t handler)
参数:
signum:注册的信号编号
handler:
SIG_IGN :忽略
SIG_DFL:缺省
函数入口:捕获:注册的信号处理的函数接口
1.信号的注册
1.signal
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
功能:
注册一个信号并设置信号的处理方式
参数:
signum:信号的编号
handler:信号的处理方式 捕获
SIG_IGN 忽略
SIG_DFL 缺省
信号对应的处理函数地址
返回值:
成功:返回上一次注册的信号处理函数
失败:返回SIG_ERR
2.信号的发送
1.kill
int kill(pid_t pid, int sig);
功能:
给进程发送信号
参数:
pid:进程的ID号
sig:信号的ID号
返回值:
成功返回0
失败返回-1
2.raise
int raise(int sig);
功能:
给调用该函数的进程发送sig信号
3.alarm
unsigned int alarm(unsigned int seconds);
功能:
间隔seconds秒后给调用进程发送一个SIGALRM信号
参数:
seconds:秒数
返回时:
成功返回上次设定剩余的时间
上次未设定则返回0
4.pause
int pause(void);
功能:
让调用该函数的进程挂起
当进程收到信号时(必须被捕获),pause被唤醒
共享内存
1.创建共享内存 shmget
int shmget(key_t key, size_t size, int shmflg);
2.建立共享内存和用户空间映射 shmgat
3.读写数据
4.解除映射关系 shmdt
5.删除共享内存 shmctl
ipcs -a 查询共享内存,信号量集,消息队列
ipcrm -s 删除信号量集
-m 删除共享内存
ipcrm -m shmid
ipcrm -M shmkey