LINUX C学习7.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
LINUX C学习7

if(semop_ret==-1) { fprintf(stderr,[%d]:Decrement Semaphore Error:%s\n\a, getpid(),strerror(errno)); } else { while(*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:%s\n\a, getpid(),strerror(errno)); } /* 不能够在其他进程反问信号灯的时候,我们删除了信号灯 */ while((wait(status)==-1)(errno==EINTR)); /* 信号灯只能够被删除一次的 */ if(i==1) if(del_semaphore(semid)==-1) fprintf(stderr,[%d]:Destroy Semaphore Error:%s\n\a, getpid(),strerror(errno)); exit(0); } 信号灯的主要用途是保护临界资源(在一个时刻只被一个进程所拥有). 3。SystemV消息队列 为了便于进程之间通信,我们可以使用管道通信 SystemV也提供了一些函数来实现进程的通信.这就是消息队列. #include sys/types.h; #include sys/ipc.h; #include sys/msg.h; int 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 cmd,struct msqid_ds *buf); struct msgbuf { long msgtype; /* 消息类型 */ ....... /* 其他数据类型 */ } msgget函数和semget一样,返回一个消息队列的标志.msgctl和semctl是对消息进行控制.. msgsnd和msgrcv函数是用来进行消息通讯的.msgid是接受或者发送的消息队列标志. msgp是接受或者发送的内容.msgsz是消息的大小. 结构msgbuf包含的内容是至少有一个为msgtype.其他的成分是用户定义的.对于发送函数msgflg指出缓冲区用完时候的操作.接受函数指出无消息时候的处理.一般为0. 接收函数msgtype指出接收消息时候的操作.如果msgtype=0,接收消息队列的第一个消息.大于0接收队列中消息类型等于这个值的第一个消息.小于0接收消息队列中小于或者等于msgtype绝对值的所有消息中的最小一个消息. 我们以一个实例来解释进程通信.下面这个程序有server和client组成.先运行服务端后运行客户端.服务端 server.c #include stdio.h; #include string.h; #include stdlib.h; #include errno.h; #include unistd.h; #include sys/types.h; #include sys/ipc.h; #include sys/stat.h; #include sys/msg.h; #define MSG_FILE server.c #define BUFFER 255 #define PERM S_IRUSR|S_IWUSR struct msgtype { long mtype; char buffer[BUFFER+1]; }; int main() { struct msgtype msg; key_t key; int msgid; if((key=ftok(MSG_FILE,a))==-1) { fprintf(stderr,Creat Key Error:%s\a\n,strerror(errno)); exit(1); } if((msgid=msgget(key,PERM|IPC_CREAT|IPC_EXCL))==-1) { fprintf(stderr,Creat Message Error:%s\a\n,strerror(errno)); exit(1); } while(1) { msgrcv(

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档