IPC --- 사용하는 공유 메모리

(1) 배관 (간단한) 파이프 익명 파이프 (프로세스 간 통신 무관 대해) 반복해서 읽을 수있는 읽기 / FIFO 네임드 파이프 반복 될 수
원리 : 커널 버퍼기구 폼 원형 큐 실현
한계 : 1. 프로세스가 자신의 판독을 기록 할 수
2. 데이터를 반복 할 수없는 읽기
3. 일방향 통신, 하프 - 듀플렉스는
단지 프로세스 간의 공통 조상과 함께 사용할 수있다 (4)
(2) 신호 (최소 오버 헤드)
((3) 공유 메모리 월 무관) : 공유 메모리 부족 mmap에 ------- 경우, munmap (자료 배포, 주소가 첫번째) 처음부터 해제해야
무효 *들을 mmap (무효 * 요지로,이 size_t 길이, 보호 해주는 지능, INT 플래그 전략 중 INT, off_t ) 오프셋
반환 값 : 성공적인 복귀 주소 매핑이 첫 번째를 만들기 위해 MAP_FAILED 매크로 반환하는 데 실패
, 1.add, 첫 번째 주소 매핑 영역의 설립, 커널, NULL 직접 사용 지정 : 매개 변수
, 2.length를 영역 크기의지도를 만들려면
3.prot, 매핑 지역 기관, PROT_READ, PROT_WRITE, PROT_READ | PROT_WRITE의
4.flags, 플래그 매개 변수는 MAP_SHARED (디스크에 반영 매핑 영역에 의해 수행 작업이)
만든 MAP_PRIVATE (매핑 영역을 수정하는 방법 디스크)에 반영되지 않습니다
매핑 파일 기술자 영역을 구축하는 데 사용 5.fd, (읽기 및 4) 디스크에 메모리 쓰기가 공유되기 때문에 쓰기 파일을 열어야
의 4K (6 오프셋 매핑 파일의 정수 회)
(4) 지역 소켓 (가장 안정적)

부모와 자식 사이의 공유 메모리 통신 (혈액 통신)

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<sys/mman.h>
  4 #include<unistd.h>
  5 #include<fcntl.h>
  6 #include<string.h>
  7 
  8 int main()
  9 {
 10         int fd = open("mytest.txt",O_RDWR | O_CREAT,0644);
 11         if(fd == -1 )
 12         {
 13                 perror("open error");
 14                 exit(1);
 15         }
 16 
 17         int len = ftruncate(fd,4);
 18         if(len == -1)
 19         {
 20                 perror("ftruncate error");
 21                 exit(1);
 22         }
 23         char * p=NULL;
 24         p = mmap(NULL,4,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
 25         if( p == MAP_FAILED )
 26         {
 27                 perror("mmap error");
 28                 exit(1);
 29         }
 30         strcpy(p,"abvc\n");
 31 
 32         int ret = munmap(p,4);
 33         if(ret == -1)
 34         {
 35                 perror("mummap error");
 36                 exit(1);
 37         }
 38         close(fd);
 39         return 0;
 40 }

혈액 관계 사이에 통신 처리하지
mmap_r.c (프로세스의 읽기 끝)

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<sys/mman.h>
  4 #include<unistd.h>
  5 #include<fcntl.h>
  6 #include<string.h>
  7 struct student{
  8 
  9         int id;
 10         char name[20];
 11         char sex;
 12 };
 13 int main()
 14 {
 15         int fd = open("file_shared.txt",O_RDWR | O_CREAT,0644);
 16         if(fd == -1 )
 17         {
 18                 perror("open error");
 19                 exit(1);
 20         }
 21 
 22         struct student st;
 23         int len = ftruncate(fd,sizeof(st));
 24         if(len == -1)
 25         {
 26                 perror("ftruncate error");
 27                 exit(1);
 28         }
 29         struct student * p=NULL;
 30         p = mmap(NULL,sizeof(st),PROT_READ,MAP_SHARED,fd,0);
 31         if( p == MAP_FAILED )
 32         {
 33                 perror("mmap error");
 34                 exit(1);
 35         }
 36 
 37         while(1)
 38         {
 39                 sleep(2);
 40                 printf("正在读取中.....\n");
 41                 printf("id=%d,name=%s, sex=%c\n",p->id,p->name,p->sex);
 42 
 43         }
 44         int ret = munmap(p,sizeof(st));
 45         if(ret == -1)
 46         {
 47                 perror("mummap error");
 48                 exit(1);
 49         }
 50         close(fd);
 51         return 0;
 52 }

mmap_w.c ().

게시 38 개 원래 기사 · 원의 찬양 (13) · 전망 4334

추천

출처blog.csdn.net/YanWenCheng_/article/details/103935650