一江春水向東流

          做一個(gè)有思想的人,期待與每一位熱愛(ài)思考的人交流,您的關(guān)注是對(duì)我最大的支持。

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            44 隨筆 :: 139 文章 :: 81 評(píng)論 :: 0 Trackbacks

          函數(shù)原型

          #include <sys/msg/h>
          int msgget (key_t key, int flag)
          int msgctl (int msgid, int cmd , sruct msgid_ds *buf);
          int msgsnd (int msgid, const void *ptr, size_t nbyes, long type, int flag);
          int msgrcv (int msgid, void *ptr, size_t nbytes, long type, int flag);

          文件msg為空文件,可以為任何內(nèi)容,這里只是為了ftok函數(shù)使用。程序通過(guò)建立消息隊(duì)列,完成進(jìn)程間通信,注意msgrcv的第四個(gè)參數(shù)為消息類型,他定義了從隊(duì)列中取消息的類型。


          下面是msgLucy.c,是建立消息隊(duì)列的

          #include<sys/ipc.h>
          #include<sys/msg.h>
          #include<sys/stat.h>
          #include<sys/types.h>

          #include<stdio.h>
          #include<fcntl.h>
          #include<signal.h>
          #include<stdlib.h>
          #include<string.h>

          #define PROJID 0xFF
          #define LUCY 1
          #define PETER 2

          int mqid;

          void terminate_handler(int signo)
          {
          ?msgctl(mqid,IPC_RMID,NULL);
          ?exit(0);
          }

          int main()
          {
          ?char filenm[] = "msg";
          ?key_t mqkey;
          ?struct msgbuf
          ?{
          ???? ?long mtype;???? ?/* message type, must be > 0 */
          ?? ?char mtext[256];? /* message data */
          ?? }msg;
          ?int ret;

          ?mqkey = ftok(filenm,PROJID);
          ?if(mqkey == -1)
          ?{
          ??perror("ftok error: ");
          ??exit(-1);
          ?}

          ?mqid = msgget(mqkey,IPC_CREAT | IPC_EXCL | 0666);
          ?if(mqid == -1)
          ?{
          ??perror("msgget error: ");
          ??exit(-1);
          ?}

          ?signal(SIGINT, terminate_handler);
          ?signal(SIGTERM, terminate_handler);

          ?while(1)
          ?{
          ??printf("Lucy: ");
          ??fgets(msg.mtext, 256, stdin);
          ??if (strncmp("quit", msg.mtext, 4) == 0)
          ??{
          ???msgctl(mqid,IPC_RMID,NULL);
          ???exit(0);
          ??}
          ??msg.mtext[strlen(msg.mtext)-1] = '\0';
          ??msg.mtype = LUCY;
          ??msgsnd(mqid,&msg,strlen(msg.mtext) + 1,0);
          ??msgrcv(mqid,&msg,256,PETER,0);
          ??printf("Peter: %s\n", msg.mtext);??
          ?}??
          }

          下面的是msgPeter,是和Lucy通信的,程序先運(yùn)行Lucy,再運(yùn)行Peter

          #include<sys/ipc.h>
          #include<sys/msg.h>
          #include<sys/stat.h>
          #include<sys/types.h>

          #include<stdio.h>
          #include<fcntl.h>
          #include<signal.h>
          #include<string.h>
          #include<stdlib.h>

          #define PROJID 0xFF
          #define LUCY 1
          #define PETER 2

          int main()
          {
          ?char filenm[] = "msg";
          ?int mqid;
          ?key_t mqkey;
          ?struct msgbuf
          ?{
          ??????? ?long mtype;???? ?/* message type, must be > 0 */
          ???????? char mtext[256];? /* message data */
          ?? }msg;
          ?int ret;

          ?mqkey = ftok(filenm, PROJID);
          ?if(mqkey == -1)
          ?{
          ??perror("ftok error: ");
          ??exit(-1);
          ?}

          ?mqid = msgget(mqkey, 0);
          ?if(mqid == -1)
          ?{
          ??perror("msgget error: ");
          ??exit(-1);
          ?}

          ?while(1)
          ?{
          ??msgrcv(mqid,&msg,256,LUCY,0);
          ??printf("Lucy: %s\n",msg.mtext);
          ??printf("Peter: ");
          ??fgets(msg.mtext,256,stdin);
          ??if(strncmp("quit", msg.mtext, 4) == 0)
          ??{
          ???exit(0);
          ??}
          ??msg.mtext[strlen(msg.mtext)-1] = '\0';
          ??msg.mtype = PETER;
          ??msgsnd(mqid,&msg,strlen(msg.mtext) + 1,0);
          ?}?
          }

          posted on 2008-04-04 23:39 allic 閱讀(1360) 評(píng)論(0)  編輯  收藏 所屬分類: linux/UNIX 應(yīng)用開(kāi)發(fā)
          主站蜘蛛池模板: 岚皋县| 安阳县| 即墨市| 那坡县| 宝应县| 济阳县| 铁岭县| 日土县| 喀喇沁旗| 苏尼特右旗| 玉林市| 互助| 荣成市| 凤庆县| 营山县| 东宁县| 普兰店市| 永新县| 宁晋县| 长宁区| 镇赉县| 垣曲县| 昌吉市| 台南县| 且末县| 南溪县| 玉龙| 安溪县| 耿马| 南京市| 贵港市| 阿克苏市| 兴安县| 丰镇市| 郁南县| 额尔古纳市| 佛坪县| 巴青县| 报价| 定兴县| 南宫市|