热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

进程间通信(IPC)学习-Change

1、Linux进程间通信方法:信号、管道与命名管道、消息队列共享主存、信号量、套接字3、信号通信3.1、在Linux环境下,可通过运行kill-l命令获得Linux支持的信号列表3.2、信号生命周期:信号诞生、信号在进程中注册、信号在进程中注销、信号处理函数执行完
1、Linux进程间通信方法:信号、管道与命名管道、消息队列共享主存、信号量、套接字
 
3、信号通信
 3.1、在Linux环境下,可通过运行“kill -l”命令获得Linux支持的信号列表
 3.2、信号生命周期:信号诞生、信号在进程中注册、信号在进程中注销、信号处理函数执行完毕
 3.3、信号处理函数
  a)、信号安装函数:#clude,主要有signal()和sigaction()函数
  b)、信号发送函数:最常用的5个发送信号的函数是:kill(),raise(),alarm(),settimer(),pause(),需包含头文件
  c)、信号操作函数:
  int sigemptyset(sigset-t *set);              //信号集合清空
  int sigfillset(sigset_t *set);            //设置包含所有信号的全集
  int sigaddset(sigset_t *set, int signo);    //把一个信号加入信号集合
  int sigdelset(sigset_t *set, int signo);     //把一个信号从集合里删除
  int sigismember(const sigset_t *set, int signo);    //判断信号是否包含在给定集合中
  int sigprocmask(int how, const sigset_t *set, sigset_t *oset);     //设置进程中断屏蔽码
  how = [SIG_BLOCK, SIG_UNBLOCK, SIG_SETMASK], *oset对设置前屏蔽码做备份
 
4、管道通信:
 4.1、概述:管道是通过内核缓冲区按先进形象地先出的方式传输数据,对于管道,可以当作是连接两个命令或应用程序的一个单向连接器。
 4.1、管道通信分为匿名管道(pipe)和命名管道(FIFO)。
 4.2、匿名管道局限性:a、只支持单向数据流;b、只能用于具有亲缘关系的进程;c、没有名字;d、缓冲区有限,大小为一个页面。 #include     int pipe(int fd[2])
 4.3、命名管道:#include      #includestat.h>    int mkfifo(const char* pathname, mode_t mode)
 
5、消息队列
5.1、消息队列基本原理:
子进程child发送首次登记的标志FLAG(msgtyp>0)和child进程号到服务器进程server注册,在server段使用msgrcv(Q_MSG_KEY, &recv_buf, sizeof(Message)-sizeof(long), FLAG, 0)接收,Message正文不包括消息头的标志。然后server端发送server进程号,接收消息标志为子进程号的Message到子进程表示接收到先前消息。
消息队列通过消息标志(即进程号)进行通信,如果客户/服务端进程有任何一方退出,则可能会出现消息丢失。即把退出一方的进程号作为标志的消息不会被任何进程接收,因为其他的进程号和消息标志不匹配。
 一般过程: 
  建立连接开始数据通信 
  回复反馈信息 
  发送注册信息
  Server
  Client 
  消息队列通信
5.2、消息队列基本操作:
 这些操作包含在以下3个头文件中:#include    #include      #include
 a)、打开或创建一个消息队列:int msgget(key_t key, int flag)
 b)、读写操作:int msgsnd(int msqid, void *msgp, size_t msgsz, int msgflg));
int msgrcv(int msqid, void *msgp, size_t msgsz, long int msgtyp, int msgflg)); //接收消息
 c)、消息队列属性操作:int msgctl(int msqid, int cmd, struct msqid_ds *buf);
 
6、信号量
6.1、信号量基本操作:
 必须包含以下3个头文件:#include  #include  #include
 a)、打开或创建信号量: int semget(key_t key, int nsems, int flag);
 b)、信号量值操作: int semop(int semid, struct sembuf *sops, unsigned nsops);可以用于增加或减小信号量值。
 c)、信号量属性操作:int semctl(int sem_id, int semnum, int cmd);
 
7、共享主存
7.1、概述:共享内存就是多个进程共享一端物理内存空间,通过把一段物理内存地址映射不同的虚空间来实现,而消息队列是把数据从应用缓冲区到核心缓冲区往返复制。因此共享内存的通信使用效率比消息队列高,但存在复杂的同步互斥关系。
7.2、基本操作:
int shmget((key_t key, int size, int shmflg));                      //创建或取得一块共享内存
int shmctl((int shmid, int cmd, struct shmid_ds *buf));             //共享内存操作
void *shmat((int shmid, const void *shmaddr, int shmflg));       //获取共享内存的指针
int shmdt((const void *shmaddr));                                   //将共享内存块从进程中分离/删除

推荐阅读
  • 优化联通光猫DNS服务器设置
    本文详细介绍了如何为联通光猫配置DNS服务器地址,以提高网络解析效率和访问体验。通过智能线路解析功能,域名解析可以根据访问者的IP来源和类型进行差异化处理,从而实现更优的网络性能。 ... [详细]
  • CentOS 7 磁盘与文件系统管理指南
    本文详细介绍了磁盘的基本结构、接口类型、分区管理以及文件系统格式化等内容,并提供了实际操作步骤,帮助读者更好地理解和掌握 CentOS 7 中的磁盘与文件系统管理。 ... [详细]
  • 本周信息安全小组主要进行了CTF竞赛相关技能的学习,包括HTML和CSS的基础知识、逆向工程的初步探索以及整数溢出漏洞的学习。此外,还掌握了Linux命令行操作及互联网工作原理的基本概念。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • 探讨如何通过编程技术实现100个并发连接,解决线程创建顺序问题,并提供高效的并发测试方案。 ... [详细]
  • 本文详细介绍了如何使用PHP检测AJAX请求,通过分析预定义服务器变量来判断请求是否来自XMLHttpRequest。此方法简单实用,适用于各种Web开发场景。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文介绍了如何在具备多个IP地址的FTP服务器环境中,通过动态地址端口复用和地址转换技术优化网络配置。重点讨论了2Mb/s DDN专线连接、Cisco 2611路由器及内部网络地址规划。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 创建第一个 MUI 移动应用项目
    本文将详细介绍如何使用 HBuilder 创建并运行一个基于 MUI 框架的移动应用项目。我们将逐步引导您完成项目的搭建、代码编写以及真机调试,帮助您快速入门移动应用开发。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文探讨了 RESTful API 和传统接口之间的关键差异,解释了为什么 RESTful API 在设计和实现上具有独特的优势。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
author-avatar
手机用户2602918611
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有