• <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>

            洗塵齋

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

            常用鏈接

            統(tǒng)計(jì)

            最新評論

            msgsnd與msgrcv函數(shù)出現(xiàn)invalid參數(shù)的問題

                 今天寫了一個(gè)小程序,使用了消息隊(duì)列的msgsnd msgrcv函數(shù),由msgsnd函數(shù)循環(huán)處理由終端輸入的消息,然后把它發(fā)送到消息隊(duì)列,而另一個(gè)進(jìn)程則循環(huán)讀取消息,進(jìn)行處理。
                這時(shí),問題出現(xiàn)了,每次調(diào)用msgrcv函數(shù)的時(shí)候,它總是第一次調(diào)用成功,而第二次返回錯(cuò)誤,察看errno=22,打印出來是invalid argument,無效參數(shù)。
                憑它的說明,可以看出可能是我調(diào)用函數(shù)的時(shí)候參數(shù)錯(cuò)誤,但為什么第一次能調(diào)用成功呢?
                檢查了一下,沒看出問題。然后google之,發(fā)現(xiàn)許多人和我出現(xiàn)了同樣的問題,但沒有人給出解答。
                自己鼓搗了好久,還是沒搞定。
                然后man 2 msgsnd,一下午不知打了多少遍了,這一次從頭到尾一個(gè)字一個(gè)字的讀了下去。
                終于發(fā)現(xiàn)問題了。
                   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  
                一直沒認(rèn)真去看,想當(dāng)然的以為msgsz就是msgp的大小了,原來人家不是,自己自作多情了。。。

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

            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)   //就是這里出錯(cuò)的,記住你了
                            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 芥之舟 閱讀(12591) 評論(4)  編輯 收藏 引用 所屬分類: unix

            評論

            # re: msgsnd與msgrcv函數(shù)出現(xiàn)invalid參數(shù)的問題 2008-07-18 23:45 jonny

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

            # re: msgsnd與msgrcv函數(shù)出現(xiàn)invalid參數(shù)的問題 2008-10-07 10:03 xwy48563526

            這個(gè)linux程序設(shè)計(jì)書上已經(jīng)寫的很清楚了  回復(fù)  更多評論   

            # re: msgsnd與msgrcv函數(shù)出現(xiàn)invalid參數(shù)的問題 2009-03-14 21:05 鄧燕均

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

            # re: msgsnd與msgrcv函數(shù)出現(xiàn)invalid參數(shù)的問題 2009-03-14 21:06 鄧燕軍

            今天我也是 發(fā)現(xiàn)這個(gè)問題 ,琢磨了近一個(gè)小時(shí) ,最后我是亂改了下,把sizeof(msg) 用一個(gè)特定的 數(shù)字替換,結(jié)果可以接收和發(fā)送。

            /*客服端*/
            #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;
            }


            /*******************************/
            /*服務(wù)器端*/
            #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));

            }
















              回復(fù)  更多評論   

            亚洲欧美日韩久久精品第一区| 久久婷婷人人澡人人| 色综合久久无码中文字幕| 欧美大香线蕉线伊人久久| 精品久久久久久久| 久久久久99精品成人片| 久久久久久久免费视频| 色婷婷久久综合中文久久蜜桃av| 国产成人精品白浆久久69| 久久e热在这里只有国产中文精品99| 一本大道久久香蕉成人网| 国产精品久久久久久福利69堂| 久久夜色精品国产www| 精品久久久久久久无码| 久久天天躁狠狠躁夜夜2020| 久久99热狠狠色精品一区| 日日狠狠久久偷偷色综合免费| 精品久久久无码人妻中文字幕| 爱做久久久久久| 久久精品国产福利国产秒| 97久久婷婷五月综合色d啪蜜芽| 久久艹国产| 99久久精品国产一区二区| 亚洲va久久久久| 开心久久婷婷综合中文字幕| 香蕉久久一区二区不卡无毒影院| 亚洲精品乱码久久久久久蜜桃不卡 | 国产精品一久久香蕉产线看| 人妻无码久久精品| 99久久精品免费国产大片| 国产精品18久久久久久vr| 欧洲人妻丰满av无码久久不卡| 久久久久久久久久久久久久| 亚洲国产精品一区二区三区久久| 精品久久久久久无码中文野结衣 | 国产情侣久久久久aⅴ免费| 日产久久强奸免费的看| 精品久久久久久久久久中文字幕| 色综合久久中文色婷婷| 欧美精品一区二区精品久久| AAA级久久久精品无码片|