一江春水向東流

          做一個有思想的人,期待與每一位熱愛思考的人交流,您的關注是對我最大的支持。

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            44 隨筆 :: 139 文章 :: 81 評論 :: 0 Trackbacks

          函數原型

          #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為空文件,可以為任何內容,這里只是為了ftok函數使用。程序通過建立消息隊列,完成進程間通信,注意msgrcv的第四個參數為消息類型,他定義了從隊列中取消息的類型。


          下面是msgLucy.c,是建立消息隊列的

          #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通信的,程序先運行Lucy,再運行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 閱讀(1356) 評論(0)  編輯  收藏 所屬分類: linux/UNIX 應用開發
          主站蜘蛛池模板: 永善县| 辽宁省| 娱乐| 沁水县| 景洪市| 穆棱市| 婺源县| 曲松县| 武宣县| 青海省| 祁门县| 黄冈市| 清丰县| 海宁市| 高碑店市| 阿合奇县| 桓仁| 吉首市| 绿春县| 淮阳县| 大连市| 本溪| 普兰店市| 海原县| 芦溪县| 万荣县| 邛崃市| 泽州县| 临武县| 迭部县| 玉田县| 万安县| 阆中市| 高雄县| 阜新| 剑河县| 广汉市| 泸水县| 合江县| 洞口县| 腾冲县|