2026/4/18 6:49:37
网站建设
项目流程
建设银行第三方网站鉴权,汽配网站建设成本,微信小程序可以做网站用,wordpress新建页面不显示不出来IPC进程间通信#xff08;interprocess communicate#xff09;为什么需要ipc #xff0c;进程空间都是独立。但是进程和进程之间有数据共享或交换的需求。种类1、古老的通信方式无名管道 有名管道 信号2、IPC对象通信#xff08; system v BSD suse fedora kernel.orginterprocess communicate为什么需要ipc 进程空间都是独立。但是进程和进程之间有数据共享或交换的需求。种类1、古老的通信方式无名管道 有名管道 信号2、IPC对象通信 system v BSD suse fedora kernel.org消息队列(用的相对少这里不讨论)共享内存信号量集3、socket通信网络通信管道的底层实现是队列无名管道匿名管道 unnamed pipe使用说明:无名管道 》pipe 》只能给有亲缘关系进程通信管道的特性1、管道是 半双工的工作模式 实际编程使用会当单工使用。2、所有的管道都是特殊的文件不支持定位操作。lseek- fd fseek -FILE*3、管道是特殊文件读写(首选)使用文件IO open,read,write,close; 可选(标准io带缓存区)fgets,fread,fgetc,1.读端存在一直向管道中去写超过64k写会阻塞。 写段写的太快2.写端是存在的读管道如果管道为空的话读会阻塞。 读段读的太快3.管道破裂读端关闭写管道。 会导致写段退出4. read 0 ,写端关闭如果管道没有内容read 0 进程间通信结束。编程顺序创建管道 》fork--读写管道 》关闭管道int pipe(int pipefd[2]); 功能创建并打开一个无名管道 参数pipefd[0] 无名管道的固定读端 pipefd[1] 无名管道的固定写端 返回值成功 0 失败 -1有名管道使用说明:有名管道 》fifo 》可以给任意单机进程通信 .有文件名称的管道。文件系统中可见编程步骤创建有名管道 》打开有名管道 》读写管道》关闭管道 》卸载有名管道特性和匿名管道特性一致。 额外的 如果有一端没有打开则默认在open函数部分阻塞。int mkfifo(const char *pathname, mode_t mode); 功能在指定的pathname路径名称下创建一个权限为 mode的有名管道文件。 参数pathname要创建的有名管道路径名称 mode 8进制文件权限。 返回值成功 0 失败 -1信号通信应用异步通信。 通知机制。 随机事件。信号发送和接收的过程1.根据需要(随机事件)发生信号。2.linux 接收到信号发生请求在pcb的链表中查找对应的pid号(1000),3.找到对应进程后使原来工作流程先暂停下执行pcb 中信号处理函数 对应下标的函数。(如果发送信号2 .则调用handle2)4.当handle2 执行完毕后原来进程的代码继续运行。系统中对信号的说明和相关默认处理行为man 7 signal信号相关函数发送信号 int kill(pid_t pid, int sig); 功能通过该函数可以给pid进程发送信号为sig的系统信号。 参数pid 要接收信号的进程pid sig 当前程序要发送的信号编号 《 kill -l 返回值成功 0 失败 -1 信号的捕获自定义处理 void ( *signal(int signum, void (*handler)(int)) ) (int); sighandler_t signal(int signum, sighandler_t handler); handler有二个宏表示 SIG_DFL 表示默认处理 SIG_IGN 表示忽略处理 fun 表示自定义处理共享内存由 system V (unix 操作系统) 提供一种进程间通信的方式。1.函数调用的步骤key 》申请对象 》映射对象》读写对象 》撤销映射 》删除对象2.与管道相关区别与管道对比1.对于读写进程而言 双方都可以读写2.没有读阻塞3.没有写阻塞。 共享内存需要和其他ipc (信号或 信号量集(同步操作))进行搭配使用4.是一个初级内存区域(像字符数组)5.不删除数据数据保持的6.相对来说共享内存空间可以自定义(4K *n ), 大空间相关函数接口key_t ftok(const char *pathname, int proj_id); 功能通过该函数可以将pathname指定的路径用来以 proj_id生成唯一的临时键值。 参数pathname 路径名称》任意文件只要不会 被删除重建即可。 proj_id 整形的数字一般用ASCII码的单字符 表示与参数1的运算。 返回值成功 返回唯一键值 失败 -1 int shmget(key_t key, size_t size, int shmflg); 功能使用唯一键值key向内核提出共享内存使用申请 参数key 唯一键值 size 要申请的共享内存大小 shmflg 申请的共享内存访问权限八进制表示 如果是第一个申请则用IPC_CREAT 如果要检测是否存在用IPC_EXCL 返回值成功 返回共享内存id一般用shmid表示 失败 -1 映射对象shmat() void *shmat(int shmid, const void *shmaddr, int shmflg); 功能将指定shmid对应的共享内存映射到本地内存。 参数shmid 要映射的本地内存 shmaddr 本地可用的地址如果不确定则用NULL表示 由系统自动分配。 shmflg 0,表示读写 SHM_RDONLY只读 返回值成功 返回映射的地址一般等于shmaddr 失败 (void*)-1 对内存的读写操作 memcpy(); //二进制对象 strcpy(); //字符串对象 撤销映射shmdt int shmdt(const void *shmaddr); 功能将本地内存与共享内存断开映射关系。 参数shmaddr 要断开的映射地址。 返回值成功 0 失败 -1 删除对象shmctl int shmctl(int shmid, int cmd, struct shmid_ds *buf); 功能修改共享内存属性也可以删除指定的共享内存对象。 参数shmid 要删除的共享内存对象 cmd IPC_RMID 删除对象的宏 buff NULL 表示只删除对象。 返回值成功 0 失败 -1 ipcs -a 查询共享内存信号量集消息队列 ipcrm -m 删除共享内存相关命令ipcs -a查询共享内存信号量集消息队列ipcrm -m删除共享内存