1、了解和熟悉Linux支持的消息通信机制、管道道通信、共享存储区机制及信息量机制。
2、掌握利用Linux系统的进程通信机制(IPC)实现进程间交换数据的方法。
1、进程通信
使用系统调用pipe()建立一条管道线:两个子进程P1和P2分别向管道各写一句话:
Child 1 is sending a message!
Child 2 is sending a message!
父进程则从管道中读出来自两个了进程的信息,显示在屏幕上。
要求父进程先接收子进程P1发来的消息,然后再接收子进程P2发来的消息。(可以通过sleep()将自身进入睡眠)
2、消息的创建,发送和接收
(1) 使用系统调用msgget (), msgsnd (), msgsrv ()及msgctl () 编制一长度为1K的消息(如个人通信录信息)的发送和接收程序.
(2) 使用共享存储区相关的系统调用 shmget (),shmat (),sgmdt (),shmctl (),编制一个与上述功能相同的程序.
(3) 比较上述两种消息通信机制中数据传输的时间。
1. 进程通信:
创建一条管道,子进程写入数据,父进程写出数据。在父进程中使用 wait() 函数,这样在子进程执行完毕之前,父进程一直要等待。
调用pipe()建立一条管道,两个子进程分别向管道写入一句话,在父进程中使用wait()函数,使父进程等待子进程执行结束,依次输出P1、P2发来的消息。
2. 消息的创建,发送和接收
2.1:
(1)用一个程序作为“引子”,先后fork()两个进程,SERVER和CLIENT,进行通信
(2)SERVER端建立一个Key为75的消息队列,等待其他进程发来的消息。当遇到类型为1的消息,则作为结束信号,取消该队列,并退出SERVER。SERVER每接受到一个消息后显示一句“(Server)received”,然后发送一个返回消息给CLIENT端,显示一句“(Server)sent”。
(3)CLIENT端使用key为75的消息队列,先后发送类型从10到1的消息,然后退出。最后一个消息,即是SERVER端需要的结束信号。CLIENT每发送一条消息后显示一句“(Client)sent”,等接受SERVER端的返回消息后,显示一句“(Client)received”,再在发送下一条消息。
(4)父进程在SERVER和CLIENT都退出后结束。
2.2:
(1)为了便于操作和观察结果,用一个 程序为“引子”,先后fork( )两个子进程,SERVER 和 CLIENT,进行通信。
(2)SERVER端建立一个KEY为75的共享区,并将第一个字节置为-1.作为数据空的标志.等待其他进程发来的消息.当该字节的值发生变化时,表示收到了该消息,进行处理.然后再次把它 的值设为-1.如果遇到的值为0,则视为结束信号,取消该队列,并退出SERVER.SERVER每接 收到一次数据后显示”(server)received”.
(3)CLIENT端建立一个为75的共享区,当共享取得第一个字节为-1时, Server端空闲,可发送 请求. CLIENT 随即填入9到0.期间等待Server端再次空闲.进行完这些操作后, CLIENT 退出. CLIENT每发送一次数据后显示”(client)sent”.
(4)父进程在SERVER和CLIENT均退出后结束.
题目一:Pipe()函数实现管道通信
(1)进入源代码文件放置目录,并对原文件进行编译
(2)运行
题目二:
1.使用系统调用msgget(), msgsnd(), msgsrv()及msgctl()编制一长度为1K的消息(如个人通信录信息)的发送和接收程序.
(1)编译
(2)运行
每当Client发送一个消息后,server接收该消息,Client再发送下一条。“(Client)sent”和“(server)received”的字样在屏幕上交替出现。
2. 使用共享存储区相关的系统调用 shmget(),shmat(),sgmdt(),shmctl(),编制一个与上述功能相同的程序
在运行的过程中,发现每当client发送一次数据后,server要等大约0.1秒才有响应。同样,之后client又需要等待大约0.1秒才发送下一个数据。当client端发送了数据后,并没有任何措施通知server端数据已经发出,需要由client的查询才能感知。此时,client端并没有放弃系统的控制权,仍然占用CPU的时间片。只有当系统进行调度时,切换到了server进程,再进行应答。
3. 比较上述两种消息通信机制中数据传输的时间
当数据量比较少时,第一种方式传输数据比利用第二种方式传输数据所有的时间要少一些。
当消息队列和共享区建立好后, 共享区的数据传输受到了系统硬件的支持, 不耗费多余的资源; 而消息传递,由软件进行控制和实现, 需要消耗一定的CPU资源. 因此, 共享区更适合频繁和大量的数据传输。
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
#include<string.h>
int main(){
int fd[3], pid1, pid2;
char OutPipe[100], InPipe[100]; //建立管道文件,并将文件描述词通过数组返回
pipe(fd); //父进程建立管道
while ((pid1 = fork()) == -1) ; //创建子进程pid1,直到成功
if (pid1 == 0){
lockf(fd[1], 1, 0); //给fd[1]文件上锁 ,实现进程互斥
sprintf(OutPipe, "Child process 2 is sending a message!"); //格式化字符串
write(fd[1], OutPipe, 50);
sleep(1); //休眠
lockf(fd[1], 0, 0); //给fd[1]文件解锁
exit(0);
}else{ //执行父进程
while ((pid2 = fork()) == -1) ; //创建子进程pid2,直到成功
if (pid2 == 0){
lockf(fd[1], 1, 0);
sprintf(OutPipe, "Child process 1 is sending a message!");
write(fd[1], OutPipe, 50);
sleep(1);
lockf(fd[1], 0, 0);
exit(0); //关闭pid2
}else{
read(fd[0], InPipe, 50);
printf("%s\n", InPipe);
wait(0);
//从fd[0]代表的读端 读取50字节 保存在buf缓冲区之后,文件的当前读写指针向后移动50字节
read(fd[0], InPipe, 50);
printf("%s\n", InPipe);
exit(0); //结束父进程
}
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <wait.h>
#include <sys/types.h>
#include <sys/msg.h>
#include <sys/ipc.h>
#define MSGKEY 75 //定义关键词MEGKEY
struct msgform //定义消息结构
{
long mtype;
char mtexe[1030]; //文本长度
}msg;
int msgqid,i;
void CLIENT(){
int i;
msgqid=msgget(MSGKEY,0777); //创建消息队列
for(i=10;i>=1;i--){
msg.mtype=i;
printf("(client)sent\n");
msgsnd(msgqid,&msg,1024,0); //发送消息msg入msgid消息队列
}
exit(0);
}
void SERVER(){
msgqid=msgget(MSGKEY,0777|IPC_CREAT); //创建一个所有用户都可以读、写、执行的队列
do{
msgrcv(msgqid,&msg,1030,0,0); //从队列msgid接受消息msg
printf("(server)receive\n");
}while(msg.mtype!=1); //消息类型为1时,释放队列
msgctl(msgqid, IPC_RMID,0); //消除消息队列的标识符
exit(0);
}
int main(){
if(fork()) //父进程
SERVER();
else //子进程
CLIENT();
wait(0);
wait(0);
}
#include<stdlib.h>
#include<unistd.h>
#include<stdio.h>
#include<wait.h>
#include<sys/types.h>
#include<sys/msg.h>
#include<sys/ipc.h>
#include <sys/shm.h>
#define SHMKEY 75 //定义共享区关键词
int shmid,i;
int *addr;
void CLIENT(){
int i;
shmid=shmget(SHMKEY,1024,0777); //获取共享区,长度1024,关键词SHMKEY
addr=shmat(shmid,0,0); //共享区起始地址为addr
for(i=9;i>=0;i--) {
while(*addr!= -1);
printf("(client)sent\n"); //打印(client)sent
*addr=i; //把i赋给addr
}
exit(0);
}
void SERVER(){
shmid=shmget(SHMKEY,1024,0777|IPC_CREAT); //创建共享区
addr=shmat(shmid,0,0); //共享区起始地址为addr
do {
*addr=-1;
while(*addr==-1);
printf("(server)received\n"); //服务进程使用共享区
}
while(*addr);
shmctl(shmid,IPC_RMID,0);
exit(0);
}
int main(){
if(fork())
SERVER();
if(fork())
CLIENT();
wait(0);
wait(0);
}
文章浏览阅读1.5w次,点赞35次,收藏385次。自己在网上找的开源项目,比较好分享给大家热门开源项目(包含小四轴、智能手环、光立方、智能车、防丢器等项目)号外!号外!(搞四轴,有这套就足够了!)科研级别的小四轴STM32F4芯片支持WIFI且android手机控制自适应控制就是牛掰!该飞机面向有科研和强烈学习意向的小伙伴们使用,如果只是想玩的话你肯定不会喜欢这套四轴的,主要设计思想是提供一个高性能的控制和姿态算法验证平台,因此..._本科毕业设计拿别人的开源代码修改
文章浏览阅读1w次,点赞2次,收藏26次。QQ 1274510382Wechat JNZ_aming商业联盟 QQ群538250800技术搞事 QQ群599020441解决方案 QQ群152889761加入我们 QQ群649347320共享学习 QQ群674240731纪年科技aming网络安全 ,深度学习,嵌入式,机器强化,生物智能,生命科学。叮叮叮:产品已上线 —>关注 官方-微信公众号——济南纪年信息科技有限公司民生项目:商城加盟/娱乐交友/创业商圈/外包兼职开发-项目发布/安全项目:态势感.._ruoyi java17
文章浏览阅读9k次,点赞2次,收藏3次。 当利用Console口为交换机设置好IP地址信息并启用HTTP服务后,即可通过支持JAVA的Web浏览器访问交换机,并可通过Web通过浏览器修 改交换机的各种参数并对交换机进行管理。事实上,通过Web界面,可以对交换机的许多重要参数进行修改和设置,并可实时查看交换机的运行状态。不过在利用 Web浏览器访问交换机之前,应当确认已经做好以下准备工作:·在用于管理的计算机中安装T..._思科交换机2960s有web配置吗
文章浏览阅读2.5w次,点赞2次,收藏6次。报错信息: [2018-09-09 20:33:12] ERROR - file: tracker_proto.c, line: 48, server: 127.0.0.1:22122, response status 2 != 0 [2018-09-09 20:33:12] ERROR - file: tracker_proto.c, line: 48, server: 127.0.0.1:..._error - file: tracker_proto.c, line: 48, server: 172.17.0.1:22122, response
文章浏览阅读3.9k次。使用matplotlib显示图片(《深度学习入门:基于Python的理论与实现》实践笔记)一、安装matplotlib库二、导入matplotlib.pyplot库和matplotlib.image库里的imread函数三、实例:显示图片一、安装matplotlib库在命令行使用下面的命令即可:pip install matplotlib二、导入matplotlib.pyplot库和matplotlib.image库里的imread函数在程序开头使用:import matplotlib.pyp_matplotlib展示图片
文章浏览阅读1.2k次。基本信息 用户单位:某应用软件研发企业 用户规模:100人以上 组织过程水平:中等 CMMI评审等级:无 Subversion使用时间:1年 客户需求 由于公司每次向新客户提交软件的时候都需要派出一个小规模的团队到客户现场进行一段时间的软件定制和维护。此外,老客户系统的重大升级和功能扩展也需要一个小团队在客户现场进行一段时间的开发。因此,异地开发的配置管理就是一_开发去客户现场的案例
文章浏览阅读3.2k次。一定时宽的语音信号,其能量的大小随时间有明显的变化。清音段能量比浊音段小得多。短时过零数也可用于语音信号分析中,发浊音时,其语音能量约集中于3kHz以下,而发清音时,多数能量出现在较高频率上。可认为浊音时具有较低的平均过零数,而清音时具有较高的平均过零数,故对一短时语音段计算其短时平均能量及短时平均过零数,就可以区分其中的清音段和浊音段,从而可判别句中清、浊音转变时刻,声母韵母的分界以及无声与有声的分界。这在语音识别中有重要意义。自己编写的matlab代码,对一段语音,取帧长为240个点,计算其平均能_matlab求语音信号短时过零率的函数
默认情况下,在Ubuntu上,sudo组的成员被授予sudo访问权限。如果您希望新创建的用户具有管理权限,需要将将用户添加到sudo组。命令将向你询问一系列的问题。密码是必需的,其他字段都是可选的。最后,输入Y确认信息是否正确。执行完上述步骤后需要重启ssh服务,否则新创建的用户连接服务器时会出现。
文章浏览阅读1.7k次。组织战略是组织实施各级项目管理,包括项目组合管理、项目集管理和项目管理的基础。只有从组织战略的高度来思考,思考各个层次项目管理在组织中的位置,才能够理解各级项目管理在组织战略实施中的作用。同时战略管理也为项目管理提供了具体的目标和依据,各级项目管理都需要与组织的战略保持一致。..._项目组织的具体形态的是战略管理层
文章浏览阅读1k次。目录基本统计量色彩空间变换亮度变换函数白平衡图像过曝的评价指标多视影像因曝光条件不一而导致色彩差异,人眼可以快速区分影像质量,如何利用图像信息辅助算法判断影像优劣。基本统计量灰度均值方差梯度均值方差梯度幅值直方图图像熵p·log(p)色彩空间变换RGB转单通道灰度图像 mean = 225.7 stddev = 47.5mean = 158.5 stddev = 33.2转灰度梯度域gradMean = -0.0008297 / -0.000157461gr_图像颜色质量评价
文章浏览阅读1.4k次。Simpson's rule for numerical integrationZ = SIMPS(Y) computes an approximation of the integral of Y via the Simpson's method (with unit spacing). To compute the integral for spacing different from one..._matlab利用幸普生计算积分
文章浏览阅读1.2w次,点赞28次,收藏61次。Hugging face 资源很不错,可是国内下载速度很慢,动则GB的大模型,下载很容易超时,经常下载不成功。很是影响玩AI的信心。经过多次测试,终于搞定了下载,即使超时也可以继续下载。真正实现下载无忧!究竟如何实现?且看本文分解。_huggingface_hub