fork、exec 和 exit 对 IPC 对象的影响
GitHub: https://github.com/storagezhang
Emai: debugzhang@163.com
华为云社区: https://bbs.huaweicloud.com/blogs/249238
本文摘自《UNIX 网络编程 卷2:进程间通信》 1.5 节
fork、exec 和 _exit 函数对于所讨论的各种形式的 IPC 的影响(_exit 是由 exit 调用的一个函数):
IPC 类型 | fork | exec | _exit |
---|---|---|---|
管道和 FIFO | 子进程取得父进程的所有打开着的描述符的副本 | 所有打开着的描述符继续打开着,除非已设置描述符的 FD_CLOEXEC 位 |
关闭所有打开着的描述符,最后一个关闭时删除管道或 FIFO 中残留的所有数据 |
Posix 消息队列 | 子进程取得父进程的所有打开着的消息队列描述符的副本 | 关闭所有打开着的消息队列描述符 | 关闭所有打开着的消息队列描述符 |
System V 消息队列 | 没有效果 | 没有效果 | 没有效果 |
Posix 互斥锁和条件变量 | 若驻留在共享内存区中而且具有进程间共享属性,则共享 | 除非在继续打开着的共享内存区中而且具有进程间共享属性,否则消失 | 除非在继续打开着的共享内存区中而且具有进程间共享属性,否则消失 |
Posix 读写锁 | 若驻留在共享内存区中而且具有进程间共享属性,则共享 | 除非在继续打开着的共享内存区中而且具有进程间共享属性,否则消失 | 除非在继续打开着的共享内存区中而且具有进程间共享属性,否则消失 |
Posix 有名信号量 | 若驻留在共享内存区中而且具有进程间共享属性,则共享 | 除非在继续打开着的共享内存区中而且具有进程间共享属性,否则消失 | 除非在继续打开着的共享内存区中而且具有进程间共享属性,否则消失 |
System V 信号量 | 子进程中所有 semadj 值都置为 0 |
所有 semadj 值都携入新程序中 |
所有 semadj 值都加到相应的信号量值上 |
fcntl 记录上锁 | 子进程不继承由父进程持有的锁 | 只要描述符继续打开着,锁就不变 | 解开由进程持有的所有未处理的锁 |
mmap 内存映射 | 父进程中的内存映射存留到子进程中 | 去除内存映射 | 去除内存映射 |
Posix 共享内存区 | 父进程中的内存映射存留到子进程中 | 去除内存映射 | 去除内存映射 |
System V 共享内存 | 附接着的共享内存区在子进程中继续附接着 | 断开所有附接着的共享内存区 | 断开所有附接着的共享内存区 |
门 | 子进程取得父进程的所有打开着的描述符,但是客户在门描述符上激活其过程时,只有父进程是服务器 | 所有门描述符都应关闭,因为它们创建时设置了 FD_CLOEXEC 位 |
关闭所有打开着的描述符 |