Linux学习-软件编程(进程间通信1)
1.概念
- 进程空间是独立的,包含文本段、数据段和系统数据段
- 多个进程没有共享的用户空间,进程是操作系统资源分配的最小单元
- 可以利用Linux内核实现多个进程间的通信
2.进程间通信常用的方式
2.1 传统Unix系统中的通信方式
- 管道
- 信号
2.2 SYS V分支中的通信方式
- 消息队列
- 共享内存
- 信号灯
2.3 BSD分支中的通信方式
- 本地域套接字
3.管道
3.1 分类
- 有名管道
- 无名管道
3.2 无名管道
原理
- 无名管道是一段内核缓存区
- 父进程通过pipe创建无名管道
- 只有该父进程的子进程才能继承得到这俩个文件描述符,才能实现通信
- 只能用于有亲缘关系的进程间通信
函数接口
pipe
原型:int pipe(int pipefd[2]); 功能:创建一个无名管道(内核缓存区)pipefd[0]:读管道的文件描述符pipefd[1]:写管道的文件描述符 返回值:成功返回0失败返回-1
管道操作特性
1.管道中至少有一个写端:
- 读取数据时,如果管道中有数据则直接读出
- 读取数据时,如果管道中没有数据则阻塞等待有数据写入才能读
2.管道中没有写端:
- 读取数据时,管道中没有数据则直接读出
- 读取数据时,管道中没有数据不阻塞等待直接向下执行
3.管道中至少有一个读端:
- 写入数据时,如果管道没有写满则直接写入
- 写入数据时,如果管道存满则阻塞等待有数据读出才能继续写入
4.管道中没有读端
- 写入数据时,会产生管道破裂的信号导致进程任务异常退出
3.3 有名管道
与无名管道区别
- 有名管道有名字,可以通过名字找到该管道
- 可以用于任意进程间通信
- 进程间通信最简单、易实现的方式
操作方式
- 进程一使用open以读、写、读写方式打开管道文件
- 进程二使用open以读、写、读写方式打开管道文件
- 两个进程可以通过向管道文件中读写数据实现进程的通信
函数接口
原型:int mkfifo(const char *pathname, mode_t mode); 功能:创建有名管道 参数:pathname:管道文件名mode:权限 返回值:成功返回0失败返回-1
4.信号
4.1 概念
- Linux系统中的信号主要是实现应用层和内核层之间的信号通知
- 应用层与内核层之间通信的信号根据含义分为很多不同的信号
- 信号主要用于多个进程任务间的事件通知
- 信号可以用于异步通信
4.2 信号的类型
- 使用kill -l查看信号类型
linux@ubuntu:~$ kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX SIGINT:中止信号(可以从键盘输入) ctrl + c SIGQUIT:退出信号(可以从键盘输入) ctrl + \ SIGKILL:杀死进程信号 SIGSEGV:段错误信号 SIGPIPE:管道破裂信号 SIGALRM:定时时间到达信号 SIGCHLD:子进程结束,父进程回收到该信号 SIGCONT:继续执行进程任务 SIGSTOP:停止进程任务 SIGTSTP:挂起信号(可以从键盘输入) ctrl + z SIGIO:异步IO信号
4.3 信号处理方法
- 缺省:信号来了,按照默认方式处理
- 忽略:信号来了,不处理信号,忽略信号
- 捕捉:信号来了,按照自定义的方式处理信号
注意:
- 9号信号(SIGKILL)和19号信号(SIGSTOP)不能被忽略和捕捉
4.4 函数接口
signal
原型: typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); 功能:设置signum对应的处理方式 参数:signum:信号的编号handler:信号的处理方式SIG_IGN:忽略信号SIG_DFL:缺省处理信号 返回值:成功返回之前处理信号的方式失败返回SIG_ERR
alarm
原型:unsigned int alarm(unsigned int seconds); 功能:设置一个定时,过seconds秒后,给进程发送SIGALRM信号 参数:seconds:秒数 返回值:成功返回上次定时剩余的秒数如果之前没有定时返回0
kill
原型:int kill(pid_t pid, int sig); 功能:给pid对应的进程发送sig信号 参数:pid:进程的ID号sig:信号的编号 返回值:成功返回0失败返回-1