生产者消费者实验(linux)

1.介绍相关命令

(1)ipcs命令在终端上显示系统内核中IPC对象状况命令功能

ipcs –m 只显示共享内存

ipcs –q 只显示消息队列

ipcs –s 只显示信号量

(2)ipcrm命令强制系统删除已经存在的IPC对象。

其命令格式为:ipcrm <msg | sem | shm > <IPC ID>

参数指定要删除的IPC对象类型,其含义是msg:消息队列;sem:信号量;shm:共享内存。IPC ID是要删除对象的标识符,这个标识符可以用ipcs命令去获得。

2.练习相关系统调用

(1)ftok函数:生成关键字。

#include <sys/types.h>

#include <sys/ipc.h>

key_t ftok(char *pathname,char proj);

函数调用成功时返回新的IPC关键字值,失败时则返回-1。常用下面的代码。

key_t mykey;

mykey=ftok(".",’a’);

其中,ftok函数混合当前目录文件"."和字符a来产生关键字mykey。只需设定server和client从同一个目录运行,就可以保证它们产生的关键字是惟一的。获得了关键字以后,就可以通过它来建立或引用具体的IPC对象了。

以下信号量相关的操作函数有相同的头文件:

#incldue <sys/types.h>

#include <sys/ipc.h>

#include <sem.h>

(2)semget函数:建立新的信号量对象或获取已有对象的标识符。

int semget(key_t key,int nsems,int semflg);

参数nsems是信号量对象所特有的,指定了新生成的信号量对象中信号量的数目。如果函数执行的是打开而不是创建操作,则这个参数被忽略。flag是用户设置的标志,如IPC_CREAT。IPC_CREAT表示若系统中尚无指名的信号量,则由核心建立一个信号量;若系统中已有信号量,便忽略IPC_CREAT。

附:     操作允许权                  八进制数

         用户可读                     00400

         用户可写                     00200

         小组可读                     00040

         小组可写                     00020

         其它可读                     00004

         其它可写                     00002         

控制命令                    值

IPC_CREAT                0001000

IPC_EXCL                 0002000

例:semid=semget(key, nsems,(IPC_CREAT|0400))创建一个关键字为key的信号量.

函数调用成功时返回信号量标识符,失败时则返回-1。

(3) semop函数:改变信号量对象中各个信号量的状态。它的声明格式为:

int semop(int semid,struct sembuf *sops,unsigned nsops);

参数semid是要操作的信号量对象的标识符,sops是sembuf的数组,它定义了semop函数要进行的操作序列,nsops保存了sops数组的长度,即semop函数将进行操作的个数。

该函数调用成功时返回0,失败时则返回-1。

数据结构sembuf:被semop函数用来定义对信号量对象的基本操作。

struct sembuf{

unsigned short sem_num;      /* semaphore index in array */

short sem_op; /* semaphore operation */

short sem_flg; /* operation flags */

}

成员sem_num为接受操作的信号量在信号量数组中的序号。成员sem_op定义了进行的操作(正、负和零),sem_flg是控制操作行为的标志。

如果sem_op是正值,就在指定的信号量中加上相应的值。这对应着释放信号量所监控的资源操作。

如果sem_op是负值,就从指定的信号量中减去相应的值。这对应着获取信号量数值的资源操作。如果没有在sem_flg中指定IPC_NOWAIT标志,那么,当现有的信号量数值小于sem_op的绝对值(现有资源少于需要的资源时),调用semop函数的进程就会被阻塞直到信号量的数值大于sem_op的绝对值(有足够资源)。

如果sem_op是零值:调用semop函数的进程会被阻塞直到对应的信号量值为0。其实质是等待信号量所监控的资源全部被使用。利用这种操作可以动态监控资源的使用并调整资源的分配,避免不必要的等待。

(4) semctl函数:直接对信号量对象进行控制。

int semctl(int semid,int semnum,int cmd,union semun arg);

semid:对象的标识符,semnum:信号量在集合中的序号,二者唯一确定一个信号量。

参数arg提供了操作所需要的一些信息。参数cmd指定了函数进行的具体操作:IPC_RMID,从内存中删除信号量对象;SETVAL,用arg参数中val成员的值来设定对象内某个信号量的值;GETVAL,返回信号量的计数值。

3.实验过程

(1)创建一个文件。

(2)编写文件。

 

(3)运行代码,得出结果。

 

 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力代码不掉头发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值