c 공유메모리 예제

On agosto 1, 2019 by adminmg

세 번째 인수인 buf는 구조체 shmid_ds라는 공유 메모리 구조에 대한 포인터입니다. 이 구조의 값은 cmd에 따라 설정하거나 얻을 때 사용됩니다. 공유 메모리 세그먼트에 대한 포인터를 얻는 방법에 대한 보다 완전한 예는 다음과 같습니다: 다른 형태의 System V IPC와 마찬가지로 shmget() 호출을 통해 공유 메모리 세그먼트가 만들어지고 연결됩니다. , 우리는 공유 메모리를 사용하지만 시스템 호출로 수행해야 할 공유 메모리를 사용하기 전에, 우리가 이것을 보자 – 그리고 bammo! 공유 메모리 세그먼트에 대한 포인터가 있습니다! shmat()은 void 포인터를 반환하며 이 경우 이를 char 포인터로 처리하고 있습니다. 당신은 당신이 거기에 있는 데이터의 종류에 따라 당신이 좋아하는 무엇이든으로 취급 할 수 있습니다. 구조의 배열에 대한 포인터는 다른 어떤 것과도 마찬가지로 허용됩니다. 위의 시스템 호출은 시스템 V 공유 메모리 세그먼트를 만들거나 할당합니다. 전달해야 할 인수는 다음과 같습니다 – 인수, shmaddr, 분리 할 공유 메모리 세그먼트의 주소입니다. 분리할 세그먼트는 shmat() 시스템 호출에서 반환되는 주소여야 합니다. 다음은 쓰기 프로세스에 대한 코드입니다 (공유 메모리에 쓰기 – 파일 : shm_write.c) 평소와 같이 조심해야 할 더 많은 gotchas가 있지만 장기적으로는 모두 매우 쉽습니다. 참조, 당신은 단지 공유 메모리 세그먼트에 연결하고 메모리에 대한 포인터를 얻을.

이 포인터를 읽고 쓸 수 있으며 모든 변경 사항은 세그먼트에 연결된 다른 모든 사람에게 표시됩니다. 더 간단한 것은 없습니다. 글쎄, 실제로,하지만 난 그냥 당신을 더 편안하게하기 위해 노력하고 있었다. 우리는 파이프와 명명 된 파이프의 IPC 기술을 본 지금은 나머지 IPC 기술 비주얼라이제이션을 알 시간이다., 공유 메모리, 메시지 큐, 세마포, 신호 및 메모리 매핑. 동시성 문제는 무엇입니까? 공유 메모리 세그먼트를 수정하는 프로세스가 여러 개 있으므로 세그먼트에 대한 업데이트가 동시에 발생할 때 특정 오류가 발생할 수 있습니다. 공유 개체에 여러 작성기가 있는 경우 이 동시 액세스는 거의 항상 문제가 됩니다. 읽기 프로세스는 공유 메모리에서 읽기를 수행하고 쓰기 프로세스 완료(구조체 shmseg의 전체 변수)가 표시될 때까지 출력에 표시되며 서버와 클라이언트가 현재 디렉터리에 있다고 가정합니다. 서버는 ftok()를 사용하여 키를 생성하고 공유 메모리를 요청하는 데 사용합니다. 공유 메모리가 데이터로 채워지기 전에 상태가 NOT_READY로 설정됩니다.

공유 메모리가 채워진 후 서버는 상태를 채우는 상태로 설정합니다. 그런 다음 서버는 상태가 TAKEN될 때까지 대기하므로 클라이언트가 데이터를 가져온 것입니다. SHM_INFO – 공유 메모리에 의해 소비된 시스템 리소스에 대한 정보가 포함된 shm_info 구조를 반환합니다. 첫 번째 인수인 shmid는 공유 메모리 세그먼트의 식별자입니다. 이 ID는 shmget() 시스템 호출의 반환 값인 공유 메모리 식별자입니다. 이미 생성된 공유 메모리 세그먼트(shmat())에 프로세스를 연결) 이 호출은 성공 시 유효한 공유 메모리 식별자(공유 메모리 추가 호출에 사용됨)를 반환하고 실패할 경우 -1을 반환합니다. 오류의 원인을 알아두려면 errno 변수 또는 perror() 함수를 사용 해 보세요.

Comments are closed.