实验8:进程间高级通信
1、实验目的
(1)掌握如何利用管道机制、消息缓冲队列、共享存储区机制进行进程间的通信;
(2)加深对上述通信机制的理解。
2、实现设备
一台装有windows 操作系统和 Linux机系统的微机或服务器。
3、实验方法与注意事项
实验室内的实验环境与系统是共用设施,请不要在系统内做对系统或对其他用户不安全的事情。
要求每个同学登录后系统后,要在自己的家目录内容以自己(拼音)名字或学号,创建一个子目录(已有者可以不再创建)。以后所有工作都要在自己的目录内进行。建议以后的实验都在同台计算机上做,这样可以保持连续性。
用户要按通常实验要认真书写实验报告。
4、实验过程
题目一:
示例1:编写一段程序,使其用管道来实现父子进程之间的进程通信。子进程向父进程发送自己的进程标识符,以及字符串“is sending a message to parent”。父进程则通过管道读出子进程发来的消息,将消息显示在屏幕上,然后终止。
1.1知识储备:
1、sprintf指的是字符串格式化命令,函数声明为 int sprintf(char *string, char *format [,argument,...]);,主要功能是把格式化的数据写入某个字符串中,即发送格式化输出到 string 所指向的字符串
2、fprintf是C/C++中的一个格式化库函数,位于头文件<cstdio>中,其作用是格式化输出到一个流文件中;函数原型为int fprintf( FILE *stream, const char *format, [ argument ]...)
3、管道
参考:linux编程之pipe()函数 - 拦云 - 博客园
int pipe(int filedes[2]);
返回值:成功,返回0,否则返回-1。参数数组包含pipe使用的两个文件的描述符。fd[0]:读管道,fd[1]:写管道。
4、lockf
int lockf(int fd, int cmd, off_t len);
fd为通过open返回的打开文件描述符。
cmd的取值为:
F_LOCK:给文件互斥加锁,若文件以被加锁,则会一直阻塞到锁被释放。
F_TLOCK:同F_LOCK,但若文件已被加锁,不会阻塞,而回返回错误。
F_ULOCK:解锁。
F_TEST:测试文件是否被上锁,若文件没被上锁则返回0,否则返回-1。
len:为从文件当前位置的起始要锁住的长度。
通过函数参数的功能,可以看出lockf只支持排他锁,不支持共享锁。
1.2程序理解
//该程序中,管道父子两个程序可以访问,子进程在管道里写东西,父进程从管道里读消息,
//从而实现进程间的通信
1.3运行结果与分析
题目二:
示例2:编写一段程序,使其用消息缓冲队列来实现client进程和 server进程之间的通信。Server进程先建立一个关键字为SVKEY(如75)的消息队列,然后等待接收类型为REQ(如1)的消息;在收到请求消息后,它便显示字符串“serving for client”和接收到的client 进程的进程标识数,表示正在为 client进程服务;然后再向client进程发送一应答消息,该消息的类型是 client进程的进程标识数,而正文则是server进程自己的标识数。client进程则向消息队列发送类型为REQ的消息(消息的正文为自己的进程标识数〉以取得sever进程的服务,并等待server进程发来的应答;然后显示字符串“receive reply from”和接收到的server进程的标识数。
2.1预备知识
1、msgget() 得到消息队列标识符或创建一个消息队列对象
2、msgsnd ()将消息写入到消息队列
3、msgrcv ()从消息队列读取消息)
参考:
linux 进程间通信之消息队列函数(msgget、msgctl、msgsnd、msgrcv)介绍及其范例_panamera12的博客-优快云博客_linux 消息队列msgget
2.2程序
2.3运行结果分析
client进程则向消息队列发送类型为REQ的消息(消息的正文为自己的进程标识数)以取得sever进程的服务,并等待server进程发来的应答,然后sever进程启动接受来自client的请求消息并发送应答消息
题目三:
示例3:编写一段程序,使其用共享存储区来实现两个进程之间的进程通信。进程A创建一个长度为512字节的共享内存,并显示写入该共享内在的数据;进程B将共享内存附加到自己的地址空间,并向共享内在中写入数据。
3.1知识储备
int shmget(key_t key, size_t size, int shmflg);
第一个参数,与信号量的semget函数一样,程序需要提供一个参数key(非0整数),它有效地为共享内存段命名,shmget()函数成功时返回一个与key相关的共享内存标识符(非负整数),用于后续的共享内存函数。调用失败返回-1.
第二个参数,size以字节为单位指定需要共享的内存容量
第三个参数,shmflg是权限标志,它的作用与open函数的mode参数一样,如果要想在key标识的共享内存不存在时,创建它的话,可以与IPC_CREAT做或操作。共享内存的权限标志与文件的读写权限一样,举例来说,0644,它表示允许一个进程创建的共享内存被内存创建者所拥有的进程向共享内存读取和写入数据,同时其他用户创建的进程只能读取共享内存。
参考:Linux进程间通信(六):共享内存 shmget()、shmat()、shmdt()、shmctl() - 52php - 博客园
3.2程序理解
3.3运行结果分析