Linux Cメッセージキュー練習(自己練習記録のみ)

23229 ワード

メッセージキューの簡単な使用
			                 ,            id        ,                
  • クライアントコード
  • #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    struct sen_usg{
            long mtype;
            pid_t cpid;
            char msg[500];
    };
    struct send{
            long mytype;
            char input[256];
    };
    int  main( void )
    {
            int msgid,ret,pid,key,key1,msgid1;
            struct sen_usg  snd_msg;
            struct send send_p;
            pid = getpid();
            key = ftok( "/tmp", 0 );
            key1= ftok( "/tmp", 9 );
            if((key<0)||(key1<0))
            {
                    perror("key fail 
    "
    ); return -1; } msgid1= msgget ( key1,IPC_CREAT|0644 ); msgid = msgget ( key, IPC_CREAT|0644 ); if((msgid==-1)||(msgid1==-1)) { perror(" msgget failure --->"); return -2; } printf("key:%xkey1:%x msgid:%d msgid1:%d
    "
    , key,key1,msgid,msgid1); /* */ snd_msg.mtype=snd_msg.cpid=getpid(); sprintf(snd_msg.msg, "---> %d ,snd_msg.cpid); ret = msgsnd( msgid,(void *)&snd_msg, sizeof(snd_msg)-sizeof(long), 0); if( ret<0 ) { perror("msgsnd failure--->"); return -3; } /* */ int n=msgrcv(msgid1,(void *)&send_p,sizeof(send_p)-sizeof(long),(long)pid,0); if(n<0){ perror("
    "
    ); return -4; } printf(" 【%s】:
    "
    ,send_p.input); return 0; }
  • サービス側コード
  • #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    struct send{
            long mtype;
            char input[256];
    };
    struct msgbuf {
                   long mtype;
                   int id;
                   char Mess[500];
    };
    int  main( void )
    {
            key_t key,key1;
            int msgid,ret,msgid2;
            struct msgbuf  msg;
            struct send send_p;
            key = ftok( "/tmp", 0 );
            key1=ftok("/tmp",9);
            if(key1<0){
                    perror("fail
    "
    ); } if(key<0){ perror("fail
    "
    ); } msgid = msgget ( key, IPC_CREAT|0644 ); msgid2= msgget ( key1, IPC_CREAT|0644 ); if(msgid==-1) { perror(" msgget fail --->"); return -2; } printf("key:%xkey1:%x msgid:%d msgid1:%d
    "
    , key,key1,msgid,msgid2); /* */ while(1){ ret = msgrcv( msgid,(void *)&msg, sizeof(msg)-sizeof(long), 0, 0); if( ret<0 ) { perror(" read msg failure......"); return -3; } printf(" [%d] :【%s】
    "
    ,msg.id,msg.Mess); /* */ send_p.mtype=msg.id; sprintf(send_p.input," [%d] ",msg.id); int Send=msgsnd(msgid2,(void *)&send_p,sizeof(send_p)-sizeof(long),0); if(Send<0){ perror("
    "
    ); return -1; } } return 0; }

    この機能はmsgrcv関数の3番目の関数でプロセスidを使用すれば実現できます.