• <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>
            posts - 200, comments - 8, trackbacks - 0, articles - 0

            一.基于文件的通信
              1.普通文件(io/mmap)
              2.有名管道文件
              3.匿名管道
              4.Socket

            二.基于內(nèi)存的通信
              0.一組內(nèi)核內(nèi)存的工具
                ipcs  
                ipcs -m
                ipcs -q
                ipcs -s      
                ipcrm -q 編號ID
              1.普通的父子進(jìn)程之間的匿名內(nèi)存共享映射
              2.內(nèi)核共享內(nèi)存
               編程模型
                 2.1.創(chuàng)建共享內(nèi)存,得到一個ID  shmget
                 2.2.把ID映射成虛擬地址(把內(nèi)核中的緩存連接到用戶進(jìn)程)  shmat
                 2.3.使用虛擬地址訪問內(nèi)核共享內(nèi)存 使用任何內(nèi)存函數(shù)與運算符號            
                 2.4.卸載虛擬地址 shmdt
                 2.5.刪除共享內(nèi)存 shctl(修改/獲取共享內(nèi)存的屬性) 
                 
               共享內(nèi)存的屬性  
                 
            案例:
               A.創(chuàng)建共享內(nèi)存,并且修改內(nèi)存數(shù)據(jù)。
               1.創(chuàng)建共享內(nèi)存

             int shmget(key_t key,//為什么需要key
                                     int size,//共享內(nèi)存大小
                                     int flags//共享內(nèi)存的屬性與權(quán)限
                        )
                為什么要key_t:
                    約定創(chuàng)建與訪問的是同一個共享內(nèi)存。
                  第三個參數(shù):
                     方式|權(quán)限
                     方式:創(chuàng)建 IPC_CREAT  IPC_EXCL
                     打開:0 
                    常見的兩種方式:
                      創(chuàng)建:IPC_CREAT|IPC_EXCL | 0666;
                      打開:0
                       
                 返回:
                   成功返回共享內(nèi)存ID
                   失敗返回-1   
               B.根據(jù)ID得到共享,并且訪問內(nèi)存數(shù)據(jù)。
             void shmat(int id,
                        void *startaddr,//0:系統(tǒng)指定首地址
                        int flags)//掛載方式,建議0,可以使用IPC_RDONLY
            C.刪除
             int shmctl(int id,//被操作的共享內(nèi)存ID
                        int how,//操作方式:一共三種操作
                        struct shmid_ds*ds)//共享內(nèi)存屬性
                 how:
                   IPC_STAT
                   IPC_SET
                   IPC_RMID 

            #include <stdio.h>
            #include <string.h>
            #include <stdlib.h>
            #include <unistd.h>
            #include <signal.h>
            #include <sys/shm.h>
            #include <sys/ipc.h>
            key_t key;
            int shmid;
            int *p;
            int i=0;
            void deal(int s)
            {
                if(s==SIGINT)
                {
                    //4.卸載共享內(nèi)存shmdt
                    shmdt(p);
                    //5.刪除共享內(nèi)存shctl
                    shmctl(shmid,IPC_RMID,0);
                    exit(0);
                }
            }
            main()
            {
                
                signal(SIGINT,deal);
                //1.創(chuàng)建共享內(nèi)存shmget
                key=ftok(".",255);
                if(key==-1) printf("ftok error:%m\n"),exit(-1);
                
                shmid=shmget(key,4,IPC_CREAT|IPC_EXCL|0666);
                if(shmid==-1) printf("get error:%m\n"),exit(-1);
                //2.掛載共享內(nèi)存shmat
                p=shmat(shmid,0,0);
                if(p==(int*)-1) printf("at error:%m\n"),exit(-1);
                //3.訪問共享內(nèi)存
                while(1)
                {
                    *p=i;
                    sleep(1);
                    i++;
                }
                
            }

            #include <stdio.h>
            #include <string.h>
            #include <stdlib.h>
            #include <unistd.h>
            #include <signal.h>
            #include <sys/shm.h>
            #include <sys/ipc.h>
            key_t key;
            int shmid;
            int *p;
            void deal(int s)
            {
                if(s==2)
                {
                    //4.卸載共享內(nèi)存shmdt
                    shmdt(p);
                    exit(0);
                }
            }
            main()
            {
                signal(SIGINT,deal);    
                //1.創(chuàng)建共享內(nèi)存shmget
                key=ftok(".",255);
                if(key==-1) printf("ftok error:%m\n"),exit(-1);
                
                shmid=shmget(key,4,0);
                if(shmid==-1) printf("get error:%m\n"),exit(-1);
                //2.掛載共享內(nèi)存shmat
                p=shmat(shmid,0,0);
                if(p==(int*)-1) printf("at error:%m\n"),exit(-1);
                //3.訪問共享內(nèi)存
                while(1)
                {        
                    sleep(1);
                    printf("%d\n",*p);
                }
            }
             3.內(nèi)核共享隊列(有序)
                編程模型:
                  3.1.創(chuàng)建共享隊列/得到隊列msgget
                  3.2.使用隊列(發(fā)送消息msgsnd/接收消息msgrcv)
                  3.3.刪除隊列msgctl
            案例:
               A:創(chuàng)建共享隊列
                 int msgget(key_t,int);      
               B:發(fā)送消息
             int msgsnd(
                        int id,//消息隊列ID
                        const void *msg,//要發(fā)送消息
                        size_t len,//消息的長度
                        int flags//發(fā)送消息的方式0或者IPC_NOWAIT,建議為0 
                    );
               返回:
                   -1:失敗
                    0:成功 
                 第二個參數(shù)的消息有固定的格式
                    4字節(jié):表示消息的類型
                    若干字節(jié):消息內(nèi)容。
                 第三個參數(shù):
                    消息的大小,不包含類型的4個字節(jié)

            #include <unistd.h>
            #include <sys/ipc.h>
            #include <sys/msg.h>
            #include <stdio.h>
            #include <stdlib.h>
            #include <string.h>
            struct msgbuf
            {
                long type;
                char data[32];
            };
            main()
            {
                key_t key;
                int msgid;
                int i;
                struct msgbuf msg;
                
                //1創(chuàng)建消息隊列
                key=ftok(".",200);
                if(key==-1) printf("ftok err:%m\n"),exit(-1);
                
                msgid=msgget(key,0/*IPC_CREAT|IPC_EXCL|0666*/);
                if(msgid==-1)printf("get err:%m\n"),exit(-1);
                //2構(gòu)造消息
                    
                
            //3發(fā)送消息
                for(i=1;i<=10;i++)
                {
                    bzero(msg.data,sizeof(msg.data));
                    msg.type=1;
                    sprintf(msg.data,"MessageI:%d",i);
                    msgsnd(msgid,&msg,sizeof(msg.data),0);
                }
                for(i=1;i<=10;i++)
                {
                    bzero(msg.data,sizeof(msg.data));
                    msg.type=2;
                    sprintf(msg.data,"MessageII:%d",i);
                    
                    msgsnd(msgid,&msg,sizeof(msg.data),0);
                }
                //4刪除隊列
                
            //msgctl(msgid,IPC_RMID,0);
            }

            #include <unistd.h>
            #include <sys/ipc.h>
            #include <sys/msg.h>
            #include <stdio.h>
            #include <stdlib.h>
            #include <string.h>
            struct msgbuf
            {
                long type;
                char data[32];
            };
            main()
            {
                key_t key;
                int msgid;
                int i;
                struct msgbuf msg;
                //1得到消息隊列
                key=ftok(".",200);
                if(key==-1) printf("ftok err:%m\n"),exit(-1);
                
                msgid=msgget(key,0);
                if(msgid==-1)printf("get err:%m\n"),exit(-1);
                //2構(gòu)造消息
                    
                
            //3接收消息
                while(1)
                {
                    bzero(&msg,sizeof(msg));
                    msg.type=2;
                    msgrcv(msgid,&msg,sizeof(msg.data),2,0);
                    printf("%s\n",msg.data);
                }
            }
            三.基于socket文件的IPC
             socket文件的通信方式,比較重要,原因:網(wǎng)絡(luò)采用這種通信模型。
             兩種模型:
                對等模型
                C/S模型
             1.對等模型:
                1.建立socket:socket
             int socket(
                            int domain,//地址族的類型AF_UNIX AF_INET
                            int type,//支持的數(shù)據(jù)格式:流SOCK_STREAM/報文SOCK_DGRAM
                            int protocol);//支持的協(xié)議,建議為0 
                返回值:
                    成功返回文件描述符號。
                    失敗返回-1;
                2.綁定在地址上(文件目錄地址)URL(Universe Resource Location)
                  協(xié)議://路徑/文件名
                  file:///usr/bin/ls
                  http://192.168.0.72/index.php
                  struct sockaddr;
                  struct sockaddr_un;un=unix
                  struct sockaddr_in;in=internet
             int bind(int fd,//socket描述符號
                        struct sockaddr*addr,//綁定地址
                        socklen_t size);//地址長度
                3.接收數(shù)據(jù)
                  read/recv/recvfrom
                4.關(guān)閉socket

            #include <sys/socket.h>
            #include <stdio.h>
            #include <stdlib.h>
            #include <string.h>
            #include <unistd.h>
            #include <linux/un.h>

            main()
            {
                int fd;
                int r;
                char buf[200];
                //1.建立socket
                fd=socket(AF_UNIX,SOCK_DGRAM,0);
                if(fd==-1) printf("socket err:%m\n"),exit(-1);
                printf("socket成功!\n");
                //2.構(gòu)造本地文件地址
                struct sockaddr_un addr={0};
                addr.sun_family=AF_UNIX;
                memcpy(addr.sun_path,"my.sock",
                                strlen("my.sock"));
                
                //3.把socket綁定在地址上
                r=bind(fd,(struct sockaddr*)&addr,sizeof(addr));
                if(r==-1) printf("bind err:%m\n"),exit(-1);
                printf("地址綁定成功!\n");
                
                //4.接收數(shù)據(jù)
                while(1)
                {
                    bzero(buf,sizeof(buf));
                    r=read(fd,buf,sizeof(buf));
                    buf[r]=0;
                    printf("%s\n",buf);
                }    
                
                //5.關(guān)閉
                close(fd);
                //6.刪除socket文件
                unlink("my.sock");
                
            }
                1.建立socket:socket
                2.連接到目標(biāo):connect(可選)    
                3.發(fā)送數(shù)據(jù):write/send/sendto
                4.關(guān)閉close

            #include <stdio.h>
            #include <stdlib.h>
            #include <sys/socket.h>
            #include <linux/un.h>
            #include <string.h>
            #include <unistd.h>
            main()
            {
                int fd;
                int r;
                char buf[100];
                struct sockaddr_un addr={0};
                //1.建立socket
                fd=socket(AF_UNIX,SOCK_DGRAM,0);
                //2.連接到指定的地址
                addr.sun_family=AF_UNIX;
                memcpy(addr.sun_path,"my.sock",
                        strlen("my.sock"));
                r=connect(fd,(struct sockaddr*)&addr,
                        sizeof(addr));
                //3.發(fā)送數(shù)據(jù)
                while(1)
                {
                    write(fd,"Hello!MaomaoYu!",
                        strlen("Hello!MaomaoYu!"));
                    sleep(1);    
                }
                //4.關(guān)閉
                close(fd);
            }

            #include <sys/socket.h>
            #include <stdio.h>
            #include <stdlib.h>
            #include <string.h>
            #include <unistd.h>
            //1.
            #include <netinet/in.h>
            #include <arpa/inet.h>

            main()
            {
                int fd;
                int r;
                char buf[200];
                //1.建立socket
                
            //2
                fd=socket(AF_INET,SOCK_DGRAM,0);
                if(fd==-1) printf("socket err:%m\n"),exit(-1);
                printf("socket成功!\n");
                //2.構(gòu)造本地文件地址
                
            //3.
                struct sockaddr_in addr={0};
                addr.sin_family=AF_INET;
                addr.sin_port=htons(9999);
                addr.sin_addr.s_addr=
                        inet_addr("192.168.180.92");
                //3.把socket綁定在地址上
                r=bind(fd,(struct sockaddr*)&addr,sizeof(addr));
                if(r==-1) printf("bind err:%m\n"),exit(-1);
                printf("地址綁定成功!\n");
                
                //4.接收數(shù)據(jù)
                while(1)
                {
                    bzero(buf,sizeof(buf));
                    r=read(fd,buf,sizeof(buf));
                    buf[r]=0;
                    printf("%s\n",buf);
                }    
                
                //5.關(guān)閉
                close(fd);
                //6.刪除socket文件
                unlink("my.sock");
                
            }

            #include <stdio.h>
            #include <stdlib.h>
            #include <sys/socket.h>
            #include <string.h>
            #include <unistd.h>
            //1
            #include <netinet/in.h>
            #include <arpa/inet.h>
            main()
            {
                int fd;
                int r;
                //2
                struct sockaddr_in addr={0};
                //1.建立socket
                
            //3
                fd=socket(AF_INET,SOCK_DGRAM,0);
                //2.連接到指定的地址
                
            //4
                addr.sin_family=AF_INET;
                addr.sin_port=htons(9999);
                addr.sin_addr.s_addr
                    =inet_addr("192.168.180.92");
                
                r=connect(fd,(struct sockaddr*)&addr,
                        sizeof(addr));
                //3.發(fā)送數(shù)據(jù)
                write(fd,"Hello!Maomaochong!",
                    strlen("Hello!Maomaochong!"));
                //4.關(guān)閉
                close(fd);dd
            }
            2.C/S模型
               Server            Client
               建立socket:socket   建立socket:socket
               綁定地址:bind       建立連接:connect
               監(jiān)聽:listen   
               接收:accept    
               read/write         read/write
               close             close
               
               int listen(int fd,int num);
                 0:監(jiān)聽成功
                 -1:失敗
            int accept(int fd,
                    struct sockaddr*addr,//返回連接著的地址
                    socklen_t* len)//接收返回地址的緩沖長度
             返回: 
                 -1:接收失敗
                 >=0:對應(yīng)客戶的文件描述符號 

            #include <stdio.h>
            #include <stdlib.h>
            #include <string.h>
            #include <unistd.h>
            #include <sys/socket.h>
            #include <linux/un.h>

            main()
            {
                int sfd;
                int cfd;
                struct sockaddr_un addr;
                int r;
                char buf[100];
                //1.建立socket
                sfd=socket(AF_UNIX,SOCK_STREAM,0);
                if(sfd==-1) printf("socket err:%m\n"),exit(-1);
                printf("建立socket成功!\n");
                
                //2.綁定地址
                bzero(&addr,sizeof(addr));
                addr.sun_family=AF_UNIX;
                memcpy(addr.sun_path,"cs.sock",
                    strlen("cs.sock")+1);
                r=bind(sfd,(struct sockaddr*)&addr,sizeof(addr));
                if(r==-1) printf("bind err:%m\n"),exit(-1);
                printf("bind成功!\n");
                
                //3.監(jiān)聽
                r=listen(sfd,10);
                if(r==-1) printf("listen err:%m\n"),exit(-1);
                printf("listen成功!\n");
                
                //4.接收客戶
                cfd=accept(sfd,0,0);
                if(cfd==-1) printf("accept err:%m\n"),exit(-1);
                printf("建立連接者的狀態(tài)成功!\n");
                //5.接收這個客戶的數(shù)據(jù)
                while(1)
                {
                    r=read(cfd,buf,sizeof(buf));
                    if(r==0)
                    {
                        printf("連接者退出");
                        break;
                    }
                    if(r==-1)
                    {
                        printf("scoket故障!\n");
                        break;
                    }
                    buf[r]=0;
                    printf("::%s\n",buf);
                    write(cfd,"Hi",2);
                    
                }
                //6.關(guān)閉客戶
                close(cfd);
                //7.關(guān)閉整個socket
                close(sfd);
                
            }

            #include <stdio.h>
            #include <stdlib.h>
            #include <sys/socket.h>
            #include <linux/un.h>
            #include <string.h>
            #include <unistd.h>
            main()
            {
                int fd;
                int r;
                char buf[100];
                struct sockaddr_un addr={0};
                //1.建立socket
                
            //fd=socket(AF_UNIX,SOCK_DGRAM,0);
                fd=socket(AF_UNIX,SOCK_STREAM,0);
                //2.連接到指定的地址
                addr.sun_family=AF_UNIX;
                memcpy(addr.sun_path,"cs.sock",
                        strlen("cs.sock"));
                r=connect(fd,(struct sockaddr*)&addr,
                        sizeof(addr));
                //3.發(fā)送數(shù)據(jù)
                while(1)
                {
                    write(fd,"Hello!MaomaoYu!",
                        strlen("Hello!MaomaoYu!"));
                    read(fd,buf,100);
                    printf("%s\n",buf);
                    sleep(1);    
                }
                //4.關(guān)閉
                close(fd);
            }

            總結(jié):
               共享內(nèi)存
               共享隊列
               socket文件通信
            課堂練習(xí):
               CS模型代碼
               CS模型把socket文件替換成IP地址

            課后作業(yè):
               模仿課堂案例獨立完成      
                 1.共享內(nèi)存
                 2.共享隊列
                 3.socket對等模型
                 4.socket的CS模型

            久久久久久久99精品免费观看| 国产成人无码精品久久久免费| 青青草国产精品久久久久| 久久精品国产亚洲AV久| 欧美与黑人午夜性猛交久久久| Xx性欧美肥妇精品久久久久久| 国产成人久久AV免费| av无码久久久久不卡免费网站 | 久久66热人妻偷产精品9| 99蜜桃臀久久久欧美精品网站 | 青草国产精品久久久久久| 久久精品国产欧美日韩99热| 午夜视频久久久久一区| 综合久久给合久久狠狠狠97色| 久久亚洲国产成人精品无码区| 久久亚洲中文字幕精品一区四 | 久久久久无码精品| 热久久国产欧美一区二区精品| 欧美成a人片免费看久久| 久久午夜免费视频| 亚洲精品美女久久777777| 久久久久99精品成人片试看| 久久夜色精品国产亚洲| 久久e热在这里只有国产中文精品99| 内射无码专区久久亚洲| 久久精品人妻中文系列| 精品久久久久香蕉网| 国产福利电影一区二区三区,免费久久久久久久精 | 国产福利电影一区二区三区久久久久成人精品综合 | 久久中文字幕视频、最近更新| 久久精品中文字幕大胸| 久久久久99精品成人片直播| 大美女久久久久久j久久| 超级碰碰碰碰97久久久久| www久久久天天com| 亚洲性久久久影院| www.久久热.com| 久久综合亚洲色HEZYO社区| 久久美女人爽女人爽| 亚洲欧美一区二区三区久久| 女人香蕉久久**毛片精品|