- 常见信号编号及含义
· SIGHUP:终端挂起或控制进程终止
· SIGINT:键盘中断(Ctrl+C)
· SIGQUIT:键盘退出(Ctrl+\)
· SIGILL:非法指令
· SIGTRAP:调试断点/陷阱
· SIGABRT:异常终止(调用abort)
· SIGBUS:总线错误
· SIGFPE:浮点异常
· SIGKILL:强制终止(不可忽略、不可捕捉)
· SIGUSR1:用户自定义信号1
· SIGSEGV:段错误(无效内存访问)
· SIGUSR2:用户自定义信号2
· SIGALRM:定时器超时(alarm触发)
· SIGTERM:终止信号(可被捕捉或忽略)
· SIGCHLD:子进程状态变化(结束或暂停)
· SIGCONT:继续执行被暂停的进程
· SIGSTOP:暂停进程(不可忽略、不可捕捉)
· SIGTSTP:挂起信号(Ctrl+Z)
· SIGPIPE:管道破裂(写端无读端)
· SIGIO:异步I/O信号
· 实时信号:SIGRTMIN 至 SIGRTMAX 范围,用于实时应用
- 关键信号特性
· SIGINT:由键盘 Ctrl+C 触发,默认终止进程。
· SIGQUIT:由键盘 Ctrl+\ 触发,默认终止并产生核心转储。
· SIGKILL:不能被忽略或捕捉,只能执行默认终止操作。
· SIGSEGV:段错误时产生,通常由非法内存访问触发。
· SIGPIPE:向无读端的管道写入时产生,默认终止进程。
· SIGALRM:由 alarm 函数定时触发,默认终止进程。
· SIGCHLD:子进程结束时发送给父进程,默认被忽略,常被捕捉用于回收子进程。
· SIGSTOP:暂停进程执行,不可被忽略或捕捉。
· SIGTSTP:由键盘 Ctrl+Z 触发,默认暂停进程。
第二部分:信号操作函数
- signal(改变信号处理方式)
· 功能:修改指定信号的处理方式。
· 三种处理方式:
· 缺省:按系统默认方式处理。
· 忽略:信号到达时不执行任何操作。
· 捕捉:调用用户自定义的处理函数。
· 返回值:成功返回上一次注册的处理函数指针,失败返回错误标识。
- pause(让进程睡眠)
· 功能:使调用进程进入睡眠状态,直到收到一个信号。
· 特点:进程会一直阻塞,直到有信号递达并处理完毕。
- alarm(设置定时器)
· 功能:在指定秒数后向调用进程发送 SIGALRM 信号。
· 特点:每个进程只有一个定时器,重复调用会重置定时时间。
- kill(发送信号)
· 功能:向指定进程发送信号。
· 参数:目标进程的PID和要发送的信号编号。
· 成功返回0,失败返回-1。
第三部分:IPC对象概述
- IPC对象概念
IPC对象是内核中的内存文件,每个IPC对象可以创建一种通信机制,包括消息队列、共享内存和信号量数组。
- IPC对象查看与管理命令
· 查看命令:
· 查看所有IPC对象
· 查看消息队列
· 查看共享内存
· 查看信号量数组
· 删除命令:通过IPC对象名称(Key值)或ID号删除对应的IPC对象。
第四部分:消息队列
- 消息队列操作步骤
· 创建IPC对象名称(获取Key值)
· 创建消息队列
· 向队列发送消息
· 从队列接收消息
· 控制/删除消息队列
- ftok(生成IPC键值)
· 功能:根据目录路径和项目ID生成唯一的IPC对象键值(Key)。
· 参数:一个存在的目录路径和一个8位项目ID。
· 返回值:成功返回Key值,失败返回-1。
- msgget(创建消息队列)
· 功能:根据Key值创建或获取消息队列ID。
· 标志选项:不存在则创建;存在则报错。
· 返回值:成功返回消息队列ID,失败返回-1。
- msgsnd(发送消息)
· 功能:向指定的消息队列发送一条消息。
· 参数要点:消息队列ID、消息结构体指针、消息数据大小、标志(默认0)。
· 消息结构需包含消息类型和消息数据两部分。
- msgrcv(接收消息)
· 功能:从指定的消息队列接收一条消息。
· 参数要点:消息队列ID、存放消息的缓冲区指针、最大接收字节数、消息类型筛选值、标志。
· 可通过消息类型参数指定接收特定类型的消息。
· 返回值:成功返回实际接收的字节数,失败返回-1。
- msgctl(控制消息队列)
· 功能:对消息队列执行控制操作。
· 支持的操作包括:获取队列状态信息、修改队列权限、删除消息队列。
第五部分:共享内存
- 共享内存特点
共享内存是进程间通信效率最高的形式,多个进程通过将同一块物理内存映射到各自的虚拟地址空间,实现数据的直接共享访问。
- 共享内存操作步骤
· 创建IPC对象名称(获取Key值)
· 创建共享内存
· 将进程地址映射到共享内存中
· 使用共享内存空间
· 解除映射
· 销毁共享内存空间
- shmget(创建共享内存)
· 功能:根据Key值创建共享内存段。
· 参数要点:Key值、共享内存大小、创建标志。
· 标志选项:不存在则创建;存在则报错。
- shmat(映射共享内存)
· 功能:将共享内存映射到当前进程的虚拟地址空间。
· 参数要点:共享内存ID、映射地址(一般传NULL由系统自动选择)、标志(默认0)。
· 返回值:成功返回映射后的地址,失败返回-1。
- shmdt(解除映射)
· 功能:从当前进程的虚拟地址空间中解除共享内存的映射。
· 参数:映射到共享内存的起始地址。
· 解除映射后,进程不能再访问该共享内存。
- shmctl(控制共享内存)
· 功能:对共享内存执行控制操作。
· 支持的操作包括:获取属性信息、修改权限、删除共享内存。
第六部分:有名信号量(信号灯)
- 信号量概念
信号量是用于进程间同步与互斥的计数器,可用于控制多个进程对共享资源的访问。
- semget(创建信号量数组)
· 功能:根据Key值创建信号量数组。
· 参数要点:Key值、信号量个数、创建标志。
· 返回值:成功返回信号量数组ID,失败返回-1。
- semctl(控制信号量)
· 功能:对信号量数组执行控制操作。
· 参数要点:信号量ID、要操作的下标、命令。
· 支持的操作包括:删除信号量数组、设置信号量的值等。
- semop(申请和释放信号量)
· 功能:对信号量执行原子操作(申请或释放资源)。
· 参数要点:信号量ID、操作结构体数组指针、操作个数。
· 操作结构体包含三个字段:信号量下标、操作值(正数为释放,负数为申请)、操作标志。
第七部分:关键概念辨析
消息队列 vs 共享内存 vs 信号量
· 消息队列:以消息为单位传递数据,支持按类型接收,适合有格式的数据通信。
· 共享内存:直接映射共享数据区,传输效率最高,但需配合同步机制使用。
· 信号量:用于进程间同步与互斥,不传输数据,仅控制资源访问权限。
有名信号量 vs 无名信号量
· 无名信号量用于线程间同步或亲缘进程间同步。
· 有名信号量通过IPC键值创建,可用于任意进程间同步。
信号 vs 信号量
· 信号是异步通知机制,用于事件通知。
· 信号量是同步机制,用于资源计数与访问控制。
shmat 与 shmdt 的配对使用
· 每次shmat映射后,使用完毕必须调用shmdt解除映射,避免进程虚拟地址空间泄漏。