网站大量收购独家精品文档,联系QQ:2885784924

实验、进(线)程同步与通信.ppt

  1. 1、本文档共28页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验、进(线)程同步与通信

实验、进(线)程同步与通信 一、实验目的 1、掌握Linux系统用户界面中键盘命令的使用。 2、学会一种Linux下的编程环境。 3、掌握Linux下进(线)程的概念。 4、了解Linux进程同步与通信的主要机制,并通过信号灯操作实现进程间的同步与互斥。 二、预备知识 1、Linux下的信号灯及其P、V操作。 在Linux中信号灯是一个数据集合(信号量数组),可以单独使用这一集合的每个元素。 有关的系统调用命令: 1)semget:返回一个被内核指定的整型的信号灯索引。 2)semop:执行对信号灯集的操作。 3)semctl:执行对信号灯集的控制操作。 信号灯的定义: 数据结构的原型是semid_ds,在linux/sem.h中定义: struct semid_ds{ struct ipc_perm sem_perm; /*permissions..seeipc.h*/ time_t sem_otime; /*last semop time*/ time_t sem_ctime; /*last change time*/ struct sem *sem_base;/*ptr to first semaphore in array*/ struct wait_queue *eventn; struct wait_queue *eventz; struct sem_undo *undo; /*undo requests on this array*/ ushort sem_nsems; /*no. of semaphores in array*/ }; 信号量的创建: 使用系统调用semget()创建一个新的信号量集,或者存取一个已经存在的信号量集. 原型:int semget(key_t key, int nsems, int semflg); 返回值:如果成功,则返回信号量集的IPC标识符。如果失败,则返回-1. key:通过相同的key值调用semget semflg:标记集合,类似open函数的标记。 一般用:IPC_CREAT | 0666 nsems:信号灯的个数 信号量的操作: 系统调用semop(); 调用原型:int semop(int semid,struct sembuf *sops,unsigned nsops); 返回值:0—成功。-1—失败 semid:semget函数返回的信号量标识符 sops:指向结构数组的指针: struct sembuf{ ushort sem_num;/*将要处理的信号量的下标*/ short sem_op; /*要执行的操作*/ short sem_flg; /*操作标志,IPC_NOWAIT */ } nsops:操作次数,一般为1 P操作 void P(int semid,int index) { struct sembuf sem; sem.sem_num = index; sem.sem_op = -1; sem.sem_flg = 0; //操作标记:0或IPC_NOWAIT等 semop(semid,sem,1); //1:表示执行命令的个数 return; } V操作 void V(int semid,int index) { struct sembuf sem; sem.sem_num = index; sem.sem_op = 1; sem.sem_flg = 0; semop(semid,sem,1); return; } 信号量的赋值:系统调用semctl() 原型:int semctl(int semid,int semnum,int cmd,union semun arg); 返回值:如果成功,则为一个正数。 semnum:信号量数组下标,即要控制的第几个信号量 cmd:要执行的动作 ·IPC_RMID将信号量集从内存中删除(不用时删除)。 ?·SETALL设置信号量集中的所有的信号量的值。 ?·SETVAL设置信号量集中的一个单独的信号量的值(第四个参数指定)。 arg.val=1; semctl(semid,1,SETVAL,arg) 2、线程 1)线程创建 pthread_create(pthread_t *thread, pthread_attr_t *

文档评论(0)

dlmus + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档