• <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 芥之舟 閱讀(12592) 評論(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));

            }
















              回復  更多評論   

            久久99精品国产麻豆| 久久久久国产成人精品亚洲午夜| 伊人久久国产免费观看视频 | 久久精品人妻中文系列| 精品综合久久久久久98| 久久这里只有精品首页| 国产精品99久久久久久猫咪| 日韩精品久久久久久久电影| 久久国产精品99久久久久久老狼 | 久久av无码专区亚洲av桃花岛| a级成人毛片久久| 亚洲日韩欧美一区久久久久我| 久久er99热精品一区二区| 久久精品国产清自在天天线| 久久精品国产清高在天天线| 思思久久99热免费精品6| 久久亚洲国产午夜精品理论片| 久久成人小视频| 久久综合精品国产一区二区三区| 久久精品国产亚洲77777| 97精品伊人久久大香线蕉| 国产精品久久久久乳精品爆| 浪潮AV色综合久久天堂| 国产成人精品综合久久久| 久久婷婷国产综合精品| 久久嫩草影院免费看夜色| 伊人久久精品线影院| 好久久免费视频高清| 久久精品人人做人人爽97| 亚洲精品乱码久久久久久蜜桃不卡| 久久久精品人妻无码专区不卡| 日本福利片国产午夜久久| 久久国产成人精品麻豆| 久久综合狠狠综合久久激情 | 精品久久人妻av中文字幕| 97久久精品无码一区二区| 99久久人妻无码精品系列| 欧美亚洲国产精品久久蜜芽| 亚洲国产成人久久综合一 | 亚洲国产日韩欧美久久| 久久亚洲天堂|