有名管道===》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;
kill -xx xxxx
发送进程 信号 接收进程
kill -9 1000
a.out 9 1000
1、发送端
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
功能:通过该函数可以给pid进程发送信号为sig的系统信号。
参数:pid 要接收信号的进程pid
sig 当前程序要发送的信号编号 《=== kill -l
返回值:成功 0
失败 -1;
进程间通信 ===》信号通信
应用:异步通信。 中断 (软件中断)
1~64;32应用编程。
软中断
进程
|
| 中断源
| /--->响应(信号)中断
| / |
| / | | - 1. 默认操作
V / 信号处理 | - 2. 忽略操作
o | | - 3. 用户自定义的处理
| \ |
| \ |
| \ |
| \----------|
|
V
int pause(void);
功能:
进程暂停,不再继续执行,除非
收到其他信号。
2、信号 kill -l ==>前32个有具体含义的信号
信号的含义详见图片
3、接收端
每个进程都会对信号作出默认响应,但不是唯一响应。
一般如下三种处理方式:
1、默认处理
2、忽略处理 9,19
3、自定义处理 9,19 捕获
以上三种方式的处理需要在如下函数上实现。
信号注册函数原型:
void ( *signal(int signum, void (*handler)(int)) ) (int);
typedef void (*sighandler_t)(int);
void (*)(int) signal(int signum, void (*)(int) handler);
//void (*signal(int signum, void (*handler)(int) ))(int) ;
typedef void (*sighandler_t)(int);
===》void (*xx)(int); == void fun(int);
===》xx是 void fun(int) 类型函数的函数指针
===》typedef void(*xx)(int) sighandler_t; ///错误
typedef int myint;
sighandler_t signal(int signum, sighandler_t handler);
===> signal(int sig, sighandler_t fun);
===> signal(int sig, xxx fun);
===>fun 有三个宏表示:SIG_DFL 表示默认处理
SIG_IGN 表示忽略处理
fun 表示自定义处理