• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            洗塵齋

            三懸明鏡垂鴻韻,九撩清泉洗塵心

            常用鏈接

            統計

            最新評論

            msgsnd與msgrcv函數出現invalid參數的問題

                 今天寫了一個小程序,使用了消息隊列的msgsnd msgrcv函數,由msgsnd函數循環處理由終端輸入的消息,然后把它發送到消息隊列,而另一個進程則循環讀取消息,進行處理。
                這時,問題出現了,每次調用msgrcv函數的時候,它總是第一次調用成功,而第二次返回錯誤,察看errno=22,打印出來是invalid argument,無效參數。
                憑它的說明,可以看出可能是我調用函數的時候參數錯誤,但為什么第一次能調用成功呢?
                檢查了一下,沒看出問題。然后google之,發現許多人和我出現了同樣的問題,但沒有人給出解答。
                自己鼓搗了好久,還是沒搞定。
                然后man 2 msgsnd,一下午不知打了多少遍了,這一次從頭到尾一個字一個字的讀了下去。
                終于發現問題了。
                   int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

                   ssize_t msgrcv(
            int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
                man文檔里有一句話:The  mtext  field  is an array (or other structure) whose size is specified by msgsz  
                一直沒認真去看,想當然的以為msgsz就是msgp的大小了,原來人家不是,自己自作多情了。。。

                這么一個小問題花了我半個下午,但現在發現總比以后出錯要好多了~ 
                寫出來,給那些第一次使用的朋友們看~~
               
                把修改后的代碼貼出來:

            struct s_msg{
                
            long type;
                
            char mtext[256];
            };

            //snd
            int
             main()
            {
                
            int mid;
                
            if((mid=msgget(4446,IPC_CREAT|0666))==-1)
                    perr_exit(
            "msgget:");
                
            char buf[BUFSIZE];
                memset(buf,
            '\0',BUFSIZE);
                s_msg mymsg;
                
            while(fgets(buf,BUFSIZE,stdin)!=NULL){
                    
            if(strlen(buf)<=2)continue;
                    buf[strlen(buf)]
            ='\0';
                    
            if(sscanf(buf,"%d%s",&mymsg.type,mymsg.mtext)!=2)
                        perr_exit(
            "Invalid input:");
                    
            if(msgsnd(mid,&mymsg,256,IPC_NOWAIT))      //msgsiz 為sizeof(mtext[]),而非sizeof(s_msg)
                        perr_exit(
            "msgsnd:");
                    memset(buf,
            '\0',BUFSIZE);
                }
                
            return 0;
            }
            //rcv
            int
             main(int argc,char **argv)
            {
                
            int mid;
                
            if((mid=msgget(4446,IPC_CREAT|0666))==-1)
                    perr_exit(
            "msgget:");
                s_msg mymsg;
                
            while(1)
                {
                    
            if(msgrcv(mid,&mymsg,256,0,MSG_NOERROR)==-1)   //就是這里出錯的,記住你了
                            perr_exit(
            "msgrcv");
                    
            if(mymsg.type!=4446)
                        cout
            <<mymsg.type<<" :"<<mymsg.mtext<<endl;
                    
            else {
                        cout
            <<"4446 quit\n";
                        
            break;    
                    }
                    memset(
            &mymsg,0,sizeof(mymsg));
                }
                
            return 0;
            }

            posted on 2007-09-19 17:52 芥之舟 閱讀(12616) 評論(4)  編輯 收藏 引用 所屬分類: unix

            評論

            # re: msgsnd與msgrcv函數出現invalid參數的問題 2008-07-18 23:45 jonny

            我也碰到同樣的問題了,多虧了樓主,謝啦。  回復  更多評論   

            # re: msgsnd與msgrcv函數出現invalid參數的問題 2008-10-07 10:03 xwy48563526

            這個linux程序設計書上已經寫的很清楚了  回復  更多評論   

            # re: msgsnd與msgrcv函數出現invalid參數的問題 2009-03-14 21:05 鄧燕均

            今天我也是 發現這個問題 ,琢磨了近一個小時 ,最后我是亂改了下,把sizeof(msg) 用一個特定的 數字替換,結果可以接收和發送。  回復  更多評論   

            # re: msgsnd與msgrcv函數出現invalid參數的問題 2009-03-14 21:06 鄧燕軍

            今天我也是 發現這個問題 ,琢磨了近一個小時 ,最后我是亂改了下,把sizeof(msg) 用一個特定的 數字替換,結果可以接收和發送。

            /*客服端*/
            #include <unistd.h>
            #include <sys/ipc.h>
            #include <sys/msg.h>
            #include <stdlib.h>
            #include <stdio.h>
            #include <string.h>

            struct msgbuf1
            {
            long msgto;
            long msgfrom;
            char buffer[100];
            } ;

            int main()
            {
            int rtrn, msqid ;
            int pid;
            struct msgbuf1 msg;


            if ((msqid = msgget(0x888, IPC_CREAT|0600)) == -1)
            {
            perror("msgget");
            exit(1);
            }
            switch(fork())
            {
            case -1:
            perror("fork");
            exit(1);
            case 0:
            execl("server3", "server3", NULL);
            perror("execl");
            exit(2);
            }
            pid =getpid();
            while(1)
            {
            msg.msgto=1;
            msg.msgfrom = pid;
            write(fileno(stdout), "cmd>",5);
            memset(msg.buffer, 0, sizeof(msg.buffer));
            rtrn= read(fileno(stdin), msg.buffer, BUFSIZ);

            if(rtrn == 0)
            {
            break;
            }
            else
            {
            msg.buffer[rtrn] = 0;
            printf("client send: %s\n", msg.buffer);
            rtrn=msgsnd(msqid, &msg, sizeof(msg), 0);
            if (rtrn<0)
            {
            perror("msgsnd");
            exit(2);
            }
            }
            if((rtrn == msgrcv(msqid,&msg, sizeof(msg), pid, 0)) !=-1)
            write(fileno(stdout), msg.buffer, strlen(msg.buffer));
            }

            msgctl(msqid, IPC_RMID, NULL);
            return 0;
            }


            /*******************************/
            /*服務器端*/
            #include <unistd.h>
            #include <sys/ipc.h>
            #include <sys/msg.h>
            #include <stdio.h>
            #include <stdlib.h>
            #include <string.h>
            #include <sys/stat.h>

            struct msgbuf1
            {
            long msgto;
            long msgfrom;
            char buffer[BUFSIZ];
            } ;
            void process_msg(char *b,int len);

            int main()
            {
            int rtrn;
            int mid;
            struct msgbuf1 msg;

            if ((mid = msgget(0x888, IPC_CREAT|0600)) == -1)
            {
            perror("msgget");
            exit(1);
            }

            while(1)
            {
            rtrn=msgrcv(mid, &msg, sizeof(msg), 1 , 0);
            if(rtrn < -1)
            {
            perror("msgrcv");
            exit(-1);
            }
            else if(rtrn ==0)
            break;
            else
            {
            process_msg(msg.buffer,strlen(msg.buffer));
            printf("server received %s\n", msg.buffer);
            msg.msgto = msg.msgfrom;
            msg.msgfrom = 1;
            if(msgsnd(mid,(struct msgbuf*)&msg, sizeof(msg), 0) ==-1)
            {
            perror("Server: msgsnd");
            exit(3);
            }
            }
            }
            msgctl(mid, IPC_RMID,(struct msqid_ds*)0);

            return 0;
            }


            void process_msg(char *b,int len)
            {
            int i = 0;
            for(i = 0; i<len; i++)
            if(isalpha(*(b+1)))
            *(b+i) = toupper(*(b+i));

            }
















              回復  更多評論   

            AA级片免费看视频久久| 无码超乳爆乳中文字幕久久| 中文字幕日本人妻久久久免费| 久久免费视频1| 国产情侣久久久久aⅴ免费| 97精品伊人久久久大香线蕉| 一本色道久久综合狠狠躁篇| 国产亚洲美女精品久久久久狼| 久久综合一区二区无码| AV狠狠色丁香婷婷综合久久| 日本道色综合久久影院| 久久人妻少妇嫩草AV无码专区| 欧美激情精品久久久久久久| 三上悠亚久久精品| 性做久久久久久久| 蜜桃麻豆www久久国产精品| 新狼窝色AV性久久久久久| 久久久久人妻一区精品 | 欧洲成人午夜精品无码区久久 | 九九久久99综合一区二区| 日韩AV毛片精品久久久| 久久久久久无码国产精品中文字幕| 人妻无码αv中文字幕久久琪琪布| 久久国产成人| 精品熟女少妇aⅴ免费久久| 久久精品无码午夜福利理论片 | 日本强好片久久久久久AAA| 久久久WWW成人| 久久国产精品一区| 88久久精品无码一区二区毛片| 久久天天躁狠狠躁夜夜躁2O2O| 中文字幕无码免费久久| 午夜精品久久久久久影视riav| 久久精品免费大片国产大片| 久久精品一区二区三区不卡| 九九精品99久久久香蕉| 性欧美大战久久久久久久久| 久久久久亚洲AV无码麻豆| 久久国产精品无码一区二区三区| 久久午夜伦鲁片免费无码| 国产精品久久久天天影视|