IPC通信
參考 linux 網絡編程第二版 敲
發現 出錯了... ...
網上也沒有特別多的參考程序。后來在 man msgrcv 里面找到了參考程序
首先一定要會用errno
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/msg.h> #include <unistd.h> #include <time.h> #include <errno.h> #include <sys/ipc.h> void msg_show_attr(int msg_id, struct msqid_ds msg_info) {int ret = -1;sleep(1);ret = msgctl(msg_id, IPC_STAT, &msg_info);if(-1 == ret){printf("獲取消息失敗 ***** %d \n",errno);return ;}printf("\n");printf("現在隊列中的字節數:%ld\n",msg_info.msg_cbytes);printf("隊列中的消息數:%d\n",(int)msg_info.msg_qnum);printf("隊列中最大的字節數:%d\n",(int)msg_info.msg_qbytes);printf("最后發送消息的進程pid: %d\n",msg_info.msg_lspid);printf("最后接受消息的進程pid: %d\n",msg_info.msg_lrpid);printf("最后發送消息的時間:%s",ctime(&(msg_info.msg_stime)));printf("最后接受消息的時間:%s",ctime(&(msg_info.msg_rtime)));printf("最后變化的時間:%s",ctime(&(msg_info.msg_ctime)));printf("消息UID是: %d\n",msg_info.msg_perm.uid);printf("消息GID是: %d\n",msg_info.msg_perm.gid);}int main() {int ret = -1;int msg_flags, msg_id;key_t key;int temp;struct msgmbuf{long mtype;char mtext[10];};struct msqid_ds msg_info;struct msgmbuf msg_mbuf;int msg_sflags,msg_rflags;char *msgpath = "/ipc/msg/";key = ftok(msgpath, 'X');if(key != -1){printf("成功建立\n");}else{printf("建立失敗\n");}msg_flags = IPC_CREAT|IPC_EXCL;msg_id = msgget(key, msg_flags|0777);if(-1 == msg_id){printf("消息建立失敗\n");return 0;}msg_show_attr(msg_id, msg_info);msg_sflags = IPC_NOWAIT;msg_mbuf.mtype = 220;memcpy(msg_mbuf.mtext, "abcdef", sizeof("abcdef"));ret = msgsnd(msg_id, (void *)&msg_mbuf, sizeof("abcdef"),msg_sflags);if(-1 == ret){printf("發送消息失敗\n");}msg_show_attr(msg_id, msg_info);msg_rflags = IPC_NOWAIT|MSG_NOERROR;temp = sizeof(struct msgmbuf) - sizeof(long);ret = msgrcv(msg_id, (void *)&msg_mbuf,temp, 220,msg_rflags);if(ret == -1){printf("接收消息失敗\n");printf("%d***",errno);}else{printf("接受消息成功長度是: %d\n",ret);}msg_show_attr(msg_id, msg_info);msg_info.msg_perm.uid = 1000;msg_info.msg_perm.gid = 1000;//msg_info.msg_qbytes = 120;ret = msgctl(msg_id, IPC_SET,&msg_info);// 設置消息屬性if(ret == -1){printf("設置消息屬性失敗\n");return 0;}msg_show_attr(msg_id, msg_info);ret = msgctl(msg_id, IPC_RMID, NULL);if(-1 == ret){printf("刪除消息失敗\n");return 0;}return 0; }后來修了一個版本 首先 那個消息結構體一定要用long,如果不用long的話。就會一直接收失敗errno的意思大概是,沒有找到對應的消息類型。
還有一個問題沒有解決,就是修改屬性是成功的可以,然后就不能成功讀取msg_info消息的值,不清楚到底是什么原因。如果有人知道,請留言。。。。。。
errno錯誤大全
轉載于:https://www.cnblogs.com/eat-too-much/p/7881703.html
總結
- 上一篇: 《VMware vSphere 6.5企
- 下一篇: Google传奇Jeff Dean最新演