进程间通信

it2023-06-17  71

IPC (进程间通信)

管道(使用最简单)
原理

管道实为内核使用环形队列机制,借助内核缓冲区实现

局限性

1.数据不能自己读写 2.数据一旦被读走,便不在管道中存在,不可反复读取 3.管道采用半双工的工作方式,数据只可以在一个方向上流动 4.只能在有公共祖先的进程间使用管道 linux下的七种文件

文件 d 目录 l 符号链接 伪文件: s 套接字 b 块设备 c 字符设备 p 管道

pipe 管道一般读写行为 fifo(有名管道i):用于非血缘关系进程间通信 共享内存 mmap void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset); 成功:返回映射区地址 失败:返回MAP_FAILED 宏

addr---建立映射区的首地址,由linux内核指定,使用时,直接传递NULL length---欲创建映射区的大小 prot---映射区权限 PROT_READPROT_WRITEPROT_READ|PORT_WRITE flags---标志位参数, MAP_SHARED:会将映射区所做的操作反映到物理磁盘上 MAP_PRIVATE:映射区所作的修改不会反映到物理设备 fd---用来建立映射区的文件描述符 offset---映射文件的偏移 **offset 必须是4K的整数倍**

匿名映射 使用映射区来完成文件读写的缺陷是:每次创建映射区一定要依赖一个文件才能实现,通常为了使用一个映射区,需要创建一个文件,然后再unlink该文件,最后close掉,十分麻烦。为了方便,我们可以使用匿名映射来代替,无需依赖一个文件即可创建映射区。

函数的参数使用注意事项。 用于非血缘关系进程间通信
信号(开销最小)

信号的概念 1.简单 2.不能携带大量信息 3.满足某个特定条件才发送

注意:每个进程收到的所有信号,都是由内核发送,内核处理

基本的属性

信号4要素 1.编号 2.名称 3.事件 4.默认处理动作

raise函数 给当前进程发送指定信号(自己给自己发) raise(signo) == kill(getpid(),signo) int raise(int sig);成功:0 失败:非0值

abort函数 给自己发送异常终止信号 sigabrt信号,终止并产生core文件

void abort();该函数无返回

kill alarm函数 setitimer signal 信号集操作函数 信号屏蔽字(阻塞信号集 set) 未决信号集(set)

信号的捕捉 — 类似于qt的信号和槽函数 注册信号捕捉函数 sigaction();

共享映射区(无血缘关系)
本地套接字(最稳定)

未完待续…

最新回复(0)