Linux 进程间通信 消息队列
1.特点: 2.步骤: 2)int msgsnd(int msqid,const void *msgp,size_t size,int flag); }; //消息正文? 3)int msgrcv(int msgid,? void* msgp,? ?size_t size,? long msgtype,? int flag);
有名管道 fifo: 可用于任意进程间,双工,有文件名,数据在内存 信号 signal: 唯一的异步通信方式 消息队列 msg:常用于cs模式中, 按消息类型访问 ,可有优先级 共享内存 shm:效率最高(直接访问内存) ,需要同步、互斥机制 信号灯集 sem:配合共享内存使用,用以实现同步和互斥 ? 例子:同一进程下 #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> struct msgbuf //消息结构体 { long types; int a; char b; }; struct msgbuf mymsgbuf,recvbuf; //定义消息结构变量 int main(int argc,const char *argv[]) { key_t key; int msgid; mymsgbuf.types = 100; //给消息结构赋值 mymsgbuf.a = 10; mymsgbuf.b = ‘b‘; key = ftok("./app",‘a‘); //获取key值 if(key < 0) { perror("ftok fail "); exit(1); } // 创建消息队列,如果消息队列存在,errno 会提示 eexist // 错误,此时只需要直接打开消息队列即可 msgid = msgget(key,IPC_CREAT|IPC_EXCL|0666); if(msgid < 0) { if(errno == EEXIST) //文件存在错误提示 { msgid = msgget(key,0666);//打开消息队列 } else //其他错误退出 { perror("msgget fail "); exit(1); } } //发送消息 msgsnd(msgid,&mymsgbuf,sizeof(mymsgbuf)-sizeof(long),0); //接收消息 msgrcv(msgid,&recvbuf,100,0); printf("mymsgbuf %d %cn",mymsgbuf.a,mymsgbuf.b); printf("recvbuf %d %cn",recvbuf.a,recvbuf.b); //删除消息队列 msgctl(msgid,NULL); return 0; } 测试: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |