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)运行代码,得出结果。