电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本
换一换
首页 金锄头文库 > 资源分类 > DOC文档下载
分享到微信 分享到微博 分享到QQ空间

Linux下C语言编程--进程通信、消息管理

  • 资源ID:471928403       资源大小:45.50KB        全文页数:9页
  • 资源格式: DOC        下载积分:15金贝
快捷下载 游客一键下载
账号登录下载
微信登录下载
三方登录下载: 微信开放平台登录   支付宝登录   QQ登录  
二维码
微信扫一扫登录
下载资源需要15金贝
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
如填写123,账号就是123,密码也是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

 
账号:
密码:
验证码:   换一换
  忘记密码?
    
1、金锄头文库是“C2C”交易模式,即卖家上传的文档直接由买家下载,本站只是中间服务平台,本站所有文档下载所得的收益全部归上传人(卖家)所有,作为网络服务商,若您的权利被侵害请及时联系右侧客服;
2、如你看到网页展示的文档有jinchutou.com水印,是因预览和防盗链等技术需要对部份页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有jinchutou.com水印标识,下载后原文更清晰;
3、所有的PPT和DOC文档都被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;下载前须认真查看,确认无误后再购买;
4、文档大部份都是可以预览的,金锄头文库作为内容存储提供商,无法对各卖家所售文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;
5、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据;
6、如果您还有什么不清楚的或需要我们协助,可以点击右侧栏的客服。
下载须知 | 常见问题汇总

Linux下C语言编程--进程通信、消息管理

Linux下C语言编程-进程通信、消息管理作者:hoyt前言:Linux下的进程通信(IPC)1.POSIX无名信号量2.System V信号量3.System V消息队列4.System V共享内存-1。POSIX无名信号量如果你学习过操作系统,那么肯定熟悉PV操作了.PV操作是原子操作.也就是操作是不可以中断的,在一定的时间内,只能够有一个进程的代码在CPU上面执行.在系统当中,有时候为了顺利的使用和保护共享资源,大家提出了信号的概念. 假设我们要使用一台打印机,如果在同一时刻有两个进程在向打印机输出,那么最终的结果会是什么呢.为了处理这种情况,POSIX标准提出了有名信号量和无名信号量的概念,由于Linux只实现了无名信号量,我们在这里就只是介绍无名信号量了. 信号量的使用主要是用来保护共享资源,使的资源在一个时刻只有一个进程所拥有.为此我们可以使用一个信号灯.当信号灯的值为某个值的时候,就表明此时资源不可以使用.否则就表>示可以使用. 为了提供效率,系统提供了下面几个函数POSIX的无名信号量的函数有以下几个:#includeint sem_init(sem_t *sem,int pshared,unsigned int value);int sem_destroy(sem_t *sem);int sem_wait(sem_t *sem);int sem_trywait(sem_t *sem);int sem_post(sem_t *sem);int sem_getvalue(sem_t *sem);sem_init创建一个信号灯,并初始化其值为value.pshared决定了信号量能否在几个进程间共享.由于目前Linux还没有实现进程间共享信号灯,所以这个值只能够取0. sem_destroy是用来删除信号灯的.sem_wait调用将阻塞进程,直到信号灯的值大于0.这个函数返回的时候自动的将信号灯的值的件一.sem_post和sem_wait相反,是将信号灯的内容加一同时发出信号唤醒等待的进程.sem_trywait和sem_wait相同,不过不阻塞的,当信号灯的值为0的时候返回EAGAIN,表示以后重试.sem_getvalue得到信号灯的值.由于Linux不支持,我们没有办法用源程序解释了.这几个函数的使用相当简单的.比如我们有一个程序要向一个系统打印机打印两页.我们首先创建一个信号灯,并使其初始值为1,表示我们有一个资源可用.然后一个进程调用sem_wait由于这个时候信号灯的值为1,所以这个函数返回,打印机开始打印了,同时信号灯的值为0 了. 如果第二个进程要打印,调用sem_wait时候,由于信号灯的值为0,资源不可用,于是被阻塞了.当第一个进程打印完成以后,调用sem_post信号灯的值为1了,这个时候系统通知第二个进程,于是第二个进程的sem_wait返回.第二个进程开始打印了.不过我们可以使用线程来解决这个问题的.我们会在后面解释什么是线程的.编译包含上面这几个函数的程序要加上 -lrt选贤,以连接librt.so库2。System V信号量 为了解决上面哪个问题,我们也可以使用System V信号量.很幸运的是Linux实现了System V信号量.这样我们就可以用实例来解释了. System V信号量的函数主要有下面几个.#include#include#includekey_t ftok(char *pathname,char proj);int semget(key_t key,int nsems,int semflg);int semctl(int semid,int semnum,int cmd,union semun arg);int semop(int semid,struct sembuf *spos,int nspos);struct sembuf short sem_num; /* 使用那一个信号 */short sem_op; /* 进行什么操作 */short sem_flg; /* 操作的标志 */;ftok函数是根据pathname和proj来创建一个关键字.semget创建一个信号量.成功时返回信号的ID,key是一个关键字,可以是用ftok创建的也可以是IPC_PRIVATE表明由系统选用一个关键字. nsems表明我们创建的信号个数.semflg是创建的权限标志,和我们创建一个文件的标志相同.semctl对信号量进行一系列的控制.semid是要操作的信号标志,semnum是信号的个数,cmd是操作的命令.经常用的两个值是:SETVAL(设置信号量的值)和IPC_RMID(删除信号灯).arg是一个给cmd的参数.semop是对信号进行操作的函数.semid是信号标志,spos是一个操作数组表明要进行什么操作,nspos表明数组的个数. 如果sem_op大于0,那么操作将sem_op加入到信号量的值中,并唤醒等待信号增加的进程. 如果为0,当信号量的值是0的时候,函数返回,否则阻塞直到信号量的值为0. 如果小于0,函数判断信号量的值加上这个负值.如果结果为0唤醒等待信号量为0的进程,如果小与0函数阻塞.如果大于0,那么从信号量里面减去这个值并返回.下面我们一以一个实例来说明这几个函数的使用方法.这个程序用标准错误输出来代替我们用的打印机.#include#include#include#include#include#include#include#include#include#include#define PERMS S_IRUSR|S_IWUSRvoid init_semaphore_struct(struct sembuf *sem,int semnum,int semop,int semflg)/* 初始话信号灯结构 */sem->sem_num=semnum;sem->sem_op=semop;sem->sem_flg=semflg;int del_semaphore(int semid)/* 信号灯并不随程序的结束而被删除,如果我们没删除的话(将1改为0)可以用ipcs命令查看到信号灯,用ipcrm可以删除信号灯的*/#if 1return semctl(semid,0,IPC_RMID);#endifint main(int argc,char *argv)char bufferMAX_CANON,*c;int i,n;int semid,semop_ret,status;pid_t childpid;struct sembuf semwait,semsignal;if(argc!=2)|(n=atoi(argv1)<1)fprintf(stderr,"Usage:%s numberna",argv0);exit(1);/* 使用IPC_PRIVATE 表示由系统选择一个关键字来创建 */* 创建以后信号灯的初始值为0 */if(semid=semget(IPC_PRIVATE,1,PERMS)=-1)fprintf(stderr,"%d:Acess Semaphore Error:%sna",getpid(),strerror(errno);exit(1);/* semwait是要求资源的操作(-1) */init_semaphore_struct(&semwait,0,-1,0);/* semsignal是释放资源的操作(+1) */init_semaphore_struct(&semsignal,0,1,0);/* 开始的时候有一个系统资源(一个标准错误输出) */if(semop(semid,&semsignal,1)=-1)fprintf(stderr,"%d:Increment Semaphore Error:%sna",getpid(),strerror(errno);if(del_semaphore(semid)=-1)fprintf(stderr,"%d:Destroy Semaphore Error:%sna",getpid(),strerror(errno);exit(1);/* 创建一个进程链 */for(i=0;i if(childpid=fork() break;sprintf(buffer,"i=%d->Process=%d->Parent=%d->Child=%dn",i,getpid(),getppid(),childpid);c=buffer;/* 这里要求资源,进入原子操作 */while(semop_ret=semop(semid,&semwait,1)=-1)&&(errno=EINTR);if(semop_ret=-1)fprintf(stderr,"%d:Decrement Semaphore Error:%sna",getpid(),strerror(errno);elsewhile(*c!='0')fputc(*c+,stderr);/* 原子操作完成,赶快释放资源 */while(semop_ret=semop(semid,&semsignal,1)=-1)&&(errno=EINTR);if(semop_ret=-1)fprintf(stderr,"%d:Increment Semaphore Error:%sna",getpid(),strerror(errno);/* 不能够在其他进程反问信号灯的时候,我们删除了信号灯 */while(wait(&status)=-1)&&(errno=EINTR);/* 信号灯只能够被删除一次的 */if(i=1)if(del_semaphore(semid)=-1)fprintf(stderr,"%d:Destroy Semaphore Error:%sna",getpid(),strerror(errno);exit(0);信号灯的主要用途是保护临界资源(在一个时刻只被一个进程所拥有).3。SystemV消息队列 为了便于进程之间通信,我们可以使用管道通信 SystemV也提供了一些函数来实现进程的通信.这就是消息队列.#include#include#includeint msgget(key_t key,int msgflg);int msgsnd(int msgid,struct msgbuf *msgp,int msgsz,int msgflg);int msgrcv(int msgid,struct msgbuf *msgp,int msgsz,long msgtype,int msgflg);int msgctl(Int msgid,int c

注意事项

本文(Linux下C语言编程--进程通信、消息管理)为本站会员(桔****)主动上传,金锄头文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即阅读金锄头文库的“版权提示”【网址:https://www.jinchutou.com/h-59.html】,按提示上传提交保证函及证明材料,经审查核实后我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.