《APUE》学习记录之———进程间通信

进程间通信:

    管道:

    管道只能在具有公共祖先的两个进程之间使用,通常,一个管道由一个进程创建,在进程调用fork之后,这个管道就可以在父子进程之间使用;

#include<unistd.h>
int pipe(int fd[2]);

    fd[0]为读打开,fd[1]为写打开,fd[1]的输出是fd[0]的输入(创建一个管道,然后调用fork,父进程关闭其读端,子进程关闭其写端,就建立了父进程写子进程读的管道);

    函数popen和pclose

#include<stdio.h>
FILE * popen(const char *cmdstring, const char *type);    // 成功返回文件指针,错误返回NULL
int pclose(FILE *fp);                                     // 成功返回cmdstring的终止状态,错误,返回-1

    函数popen先执行fork,然后调用exec执行cmdstring,并且返回一个标准的I/O文件指针,type如果是“r”,则文件指针链接到cmdstring的标准输出,如果type是“w”,则文件则连接到cmdstring的标准输入;

    协同进程

    UNIX系统过滤程序从标准输入读取数据,向标准输出写数据,几个过滤程序通常在shell管道中线性连接,当一个过滤程序既产生某个过滤程序的输出,有读取带过滤程序的输入时,它就变为协同进程;

    popen只提供连接到另外一个进程的标准输入或标准输出的单向管道,而协同进程则有连接到另外一个进程的两个单向管道:一个接到其标准输入,另外一个接到其标准输出(可以将数据写到标准输入,处理后,从标准输出读取数据);

int fd1[2],fd2[2];
if((pid = fork()) > 0){    // parent
    close(fd1[0]);
    close(fd2[1]);
    ...
}else{                     // child 
    close(fd1[1]);
    close(fd2[0]);
    ...
}

    FIFO

    FIFO被称为命名管道( popen,协同进程其实都是匿名管道的一种),未命名的管道只能在两个相关的进程之间使用,而且这两个相关进程还必须有一个共同创建它们的祖先进程,FIFO可以用于不相关进程交换数据;

#include<sys/stat.h>
int mkfifo(const char* *path, mode_t mode);                    //成功返回0,失败返回-1
int mkfifioat(int fd, const char *path, mode_t mode);          //成功返回0,失败返回-1

    path实际上相当于管道的“名字”,所以一个给定的FIFO会有多个写进程是常见的,这就意味着如果不希望多个进程所写的数据交叉,则必须考虑原子写操作;

    FIFO常用的两种用途:

    1.shell命令将FIFO将数据从一条管道传到另外几条管道时,不需要创建中间临时文件;(单写入多读取,发散

    2.客户进程-服务器进程中,FIFO用作汇聚点,在客户进程和服务器进程之间传递数据;(多写入单读取,汇聚

    消息队列

    消息队列是消息的链接表,存储在内核中,由消息队列标识符标识;

#include<sys/msg.h>
int msgget(key_t key, int flag);                // 成功,返回队列ID,错误,返回-1
int msgsnd(int msqid, const void *ptr, siez_t nbytes, int flag); // 成功,返回0,错误,返回-1
ssize_t msgrcv(int msqid, void* ptr, size_t nbytes, long type, int flag); // 成功,返回消息数据部分的长度,错误返回-1

    msgget用于创建一个新队列,或打开一个现有队列,msgsed将心消息添加到队列尾端,msgrcv用于从队列中读取消息,并不一定以先进先出次序读取消息,也可以按消息的类型字段读取消息;

    信息量

    信号量是一个计数器(与管道,FIFO,和消息队列不同),用于多个进程(线程)提供对共享数据的访问;

    为了获得共享资源,进程需要执行以下的动作:

    1. 测试控制资源的信号量;

    2. 若为正,则进程可以使用该资源,这种情况下,进程会将信号量减一(资源被占用);

    3. 否则,信息量的值为0,进程进入休眠状态,直到信号量大于0,进程被唤醒,进入第一步;

    共享存储

    共享存储允许两个或多个进程共享一个给定的存储区,因为数据无需在客户进程和服务器进程之间复制,所有这是最快的一种IPC(进程间通信);
    因为共享空间可能会出现竞争环境,所有,对空间的读写应该加锁(或设置信号量);

    共享存储的一种形式上,在多个进程中将同一个文件映射到它们的地址空间,XSI共享则是没有相关的文件,XSI共享存储的是内存的匿名段;

    杂项:

    IPC(信号量,共享存储,消息队列)的问题是:
    IPC 结构是在系统范围内起作用的,没有引用计数,如果进程创建了一个消息队列,并且在队列中放入了消息,然后终止,那么消息队列及其内容不会被删除,而与管道相比,当最后一个引用管道的进程终止时,管道就被完全地删除了,最后一个引用FIFO的进程终止时,虽然FIFO的名字仍保留在系统,但是留在FIFO的数据已经被删除;

    IPC结构不使用文件描述符,所以不能对它们使用多路转接I/O函数(select 和  poll),使得很难一次使用一个以上的IPC结构;

    信息量实际上是同步原语,而不是IPC,常用于共享资源(共享存储)的同步访问;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值