进程间通信 (IPC机制:interprocess communicate):
同一主机进程间通信:
1. 无名管道
2. 有名管道
3. 信号
4. 共享内存
5. 消息队列
6. 信号灯
不同主机进程间通信:
7. 网络套接字
1.无名管道:用于同一主机下,具有亲缘关系的父子进程间通信。
1. 创建一个无名管道并打开
int pipe(int pipefd[2]);
功能:
参数:
pipefd:
pipefd[0] : 管道的读端
pipefd[1] : 管道的写端
返回值:
成功:0;
失败:-1
2. 读管道:read:
3. 写管道: write
4. 关闭管道: close
2.有名管道:用于同一主机子下,任意进程间通信。
1. 默认64K大小
2. 管道存储数据时,按照FIFO的方式存储。
3. 写阻塞:管道读写端都存在时,向管道中写入数据,当管道满时,发生写阻塞。
读阻塞:管道读写端都存在时,从管道中读数据,如果管道中有数据,read返回实际读到的字节数;
如果管道中无数据,read发生读阻塞。
读到0:管道的写端关闭,只保留读端,从管道读数据,若有数据,则读到数据,
若无数据,则read返回0,不阻塞。
管道破裂:管道的读端关闭,只保留写端,向管道中写入数据,发生管道破裂(异常)
1. 创建管道文件
int mkfifo(const char *pathname, mode_t mode)
2. 打开管道文件 : open
读端和写端必须同时打开。
3. 读写管道文件 : write/read
4. 关闭管道文件 :close
5. 删除管道文件 : remove
3.信号:
管道:同步通信
信号:进程间的异步通知(通信)机制
软中断
1.kill -l 查看信号类型
2) SIGINT:ctrl + c
让一个进程被打断
3) SIGQUIT:ctrl + \
让一个进程结束
9) SIGKILL:
强制让一个进程结束
11)SIGSEGV:
让一个进程结束(段错误)
13)SIGPIPE:
让一个进程结束(管道破裂)
14)SIGALRM:
让一个进程结束(定时时间到达)
17)SIGCHLD:
子进程结束时发送给父进程
18)SIGCONT:
让停止态的进程继续执行
19)SIGSTOP:
让运行态的进程进入停止态(暂停)强制停止
20)SIGTSTP:
ctrl + z 让进程进入暂停态,后台进程
来自终端的停止信号
用户自定义信号
SIGUSR1
SIGUSR2
管理员信号:无法被捕获和忽略
9 SIGKILL
19 SIGSTOP
2.发送信号
int kill(pid_t pid, int sig);
功能:给指定进程发送信号
参数:
pid:进程pid号
sig:发送的信号编号
int pause(void);
功能:挂起当前进程
(S:可中断睡眠状态)
可以通过发送信号的方式,唤醒pause挂起的进程,信号必须被捕获。
unsigned int alarm(unsigned int seconds);
功能:
间隔seconds秒后给调用进程发送一个SIGALRM信号
3.接收信号
1. 忽略:不处理
2 .捕获:按照用户自定义方式处理
3. 缺省:按照信号默认方式处(若不注册)
1. 注册信号处理函数
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
功能:信号的接收方,注册一个信号处理函数
参数:
signum:注册的信号的编号
handler:
SIG_IGN : 以忽略方式处理
SIG_DFL: 以缺省方式处理
函数的地址:以捕获方式处理
返回值:
失败:SIG_ERR