实验六:Linux进程间通信(2)(4课时)实验目的:理解进程通信原理;掌握进程中信号量、共享内存、消息队列相关的函数的使用
实验原理:Linux下进程通信相关函数除上次实验所用的几个还有:信号量信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是前一节的共享内存方式的进程间通信
要调用的第一个函数是semget,用以获得一个信号量ID
intsemget(key_tkey,intnsems,intflag);key是IPC结构的关键字,flag将来决定是创建新的信号量集合,还是引用一个现有的信号量集合
nsems是该集合中的信号量数
如果是创建新集合(一般在服务器中),则必须指定nsems;如果是引用一个现有的信号量集合(一般在客户机中)则将nsems指定为0
semctl函数用来对信号量进行操作
intsemctl(intsemid,intsemnum,intcmd,unionsemunarg);不同的操作是通过cmd参数来实现的,在头文件sem
h中定义了7种不同的操作,实际编程时可以参照使用
semop函数自动执行信号量集合上的操作数组
intsemop(intsemid,structsembufsemoparray[],size_tnops);semoparray是一个指针,它指向一个信号量操作数组
nops规定该数组中操作的数量
ftok原型如下:key_tftok(char*fname,intid)fname就是指定的文件名(该文件必须是存在而且可以访问的),id是子序号,虽然为int,但是只有8个比特被使用(0-255)
当成功执行的时候,一个key_t值将会被返回,否则-1被返回
共享内存共享内存是运行在同一台机器上的进程间通信最快的方式,因为数据不需要在不同的进程间复制
通常由一个进程创建一块共享内存区,其余进程对这块内存区进行读写