好文档 - 专业文书写作范文服务资料分享网站

共享内存和信号量

天下 分享 时间: 加入收藏 我要投稿 点赞

共享内存和信号量

邢卫 2008-11-26修订

实验目的

学习并把握Linux系统中的进程间通信机制,包括共享内存和信号量。

实验内容

1. 学习共享内存相关的系统调用

shmget(), shmat(), shmdt, shmctl() 2. 学习信号量(semaphore)相关的系统调用

semget(), semop(), semctl() 3. 学习信号(signal)相关的系统调用

signal(), atexit()等

4. 完成《边干边学》第6.4.1节的实验程序的编辑、编译、运行操作 5. 分析、学习实验程序的工作过程和原理

6. 选做:学习《边干边学》第6章,结合使用联机手册(能够从man 2 ipc命令开

始),编程练习各种进程间通信机制

实验步骤

1.以stu帐号登录

2.编辑reader_writer1.c程序

注意:在193页delete()函数中,注意改成

if (mysemctl(Semid, 0, IPC_RMID, (union semun)0) == -1) { 限于实验的时刻,该文件已预先存放在/home/stu/.kernel/lab6名目下,能够直截了当使用。但每位同学务必通读并明白得该程序。 登录后,使用 cd .kernel/lab6 命令进入该文件所在名目,连续以下实验步骤。 3.编译 gcc reader_writer1.c -o reader_writer1 4.运行 ./reader_writer1

注意记录下共享内存的id号

5.使用 Alt+F2切换到第2个登录窗口,再次以stu帐号登录

能够使用who命令查看验证现在有两个stu用户已登录 能够使用ps –l命令查看这两个stu用户的进程

6.在第2个stu用户窗口中,输入 ./reader_writer1 共享内存的id号

注意:现在,第2个stu用户窗口中的进程担当writer角色,第1个stu用户窗口中的进程担当reader角色。

7.在第2个窗口中,多次输入信息;使用Alt+F1和Alt+F2在两个窗口间切换,观看你对writer的输入,writer差不多通过共享内存传递给了reader。 8.现在,你还能够使用Alt+F3切换到第3个登录窗口,并以stu帐号登录

能够使用who命令验证有3个stu用户登录;

能够经常性使用ps –l命令来查看另外两个窗口中的进程的状态

9.切换到writer窗口(第2个窗口),通过对writer的咨询题回答“2”,退出writer。切换到reader窗口(第1个窗口),通过Ctrl+C终止reader进程。

摸索题

1. 同样的源程序,reader和writer进程是如何样各自找到自己的定位的?

2. reader和writer是如何样通过信号量(semphore)实现同步的?writer是如何得知

这一对信号量的id的?

3. 数据是如何从writer传递到reader的? 4. writer是如何得知共享内存的id的?

5. 在reader中,是如何捕捉Ctrl-C信号(signal)的?捕捉后是如何处理的? 6. 一样来讲,在Linux中使用共享内存(shared memory)的流程应该如何样?使用

哪些系统调用?

7. 一样来讲,在Linux中使用信号量(semaphore)的流程应该如何样?使用哪些系

统调用?

8. 那个地点的共享内存,和使用带CLONE_VM标志的clone()系统调用创建的两

个task之间共享的内存,有什么异同?

参考资料

? 《边干边学》(第1版)第6章,“共享内存”

? 具体源程序和实验操作详见6.4.1节

附录1

共享内存的使用

共享内存共有4个系统调用:shmget,shmat,shmdt,shmctl

int shmget(key_t key, int size, int shmflg);

典型的创建共享内存的用法

? shmid = shmget(key, size, IPC_CREAT | IPC_EXCL | mode); ? shmid = shmget(IPC_PRIVATE, size, mode);

void *shmat(int shmid, const void *shmaddr, int shmflg); 典型用法:

? shmaddr = shmat(shmid, NULL, 0);

int shmdt(const void *shmaddr);

int shmctl(int shmid, int cmd, struct shmid_ds *buf); 典型用法:

? 取状态 shmctl(shmid, IPC_STAT, &buf); ? 删除 shmctl(shmid, IPC_RMID, NULL); 实例

struct shmid_ds buf; shmid = shmget(key, size, flag); if (shmid == -1) { // error handling ... } shmctl(shmid, IPC_STAT, &buf); // 分析利用buf中的信息 shmaddr = (char *)shmat(id, NULL, 0); if (shmaddr == -1) { // error handling ... } 通过shmaddr使用共享内存的部分,如strcpy, sprintf, memcmp, 赋值操作,等等 shmdt(shmaddr); shmctl(shmid, IPC_RMID, NULL);

共享内存和信号量

共享内存和信号量邢卫2008-11-26修订实验目的学习并把握Linux系统中的进程间通信机制,包括共享内存和信号量。实验内容1.学习共享内存相关的系统调用shmget(),shmat(),shmdt,shmctl()2.学习信号量(semapho
推荐度:
点击下载文档文档为doc格式
6lyhq5yutm3y3j84vsq02xzhu2kzfw009r5
领取福利

微信扫码领取福利

微信扫码分享