aug 02, 2019
admin
0
52

c언어 공유메모리 예제

이 예제에서는 서버와 클라이언트가 별도의 프로세스입니다. 첫째, 공유 메모리를 통한 순진한 의사 소통 체계가 설정됩니다. 공유 메모리는 하나의 상태 변수 상태와 4개의 정수 배열로 구성됩니다. 변수 상태는 데이터 영역이 아직 데이터로 채워지지 않은 경우 NOT_READY 값을 가지며, 서버가 공유 메모리에 데이터를 입력한 경우 채워지고 클라이언트가 공유 메모리의 데이터를 가져온 경우 촬영합니다. 정의는 다음과 같습니다. 이 파일을 다운로드하려면 여기를 클릭하십시오 (shm-02.h). 다음은 위에서 정의한 함수를 사용하여 버퍼를 할당하는 예제 프로그램입니다. 부모 프로세스는 메시지, 포크를 작성한 다음 자식이 버퍼를 수정할 때까지 기다립니다. 두 프로세스 모두 공유 메모리를 읽고 쓸 수 있습니다.

두 번째 인수인 shmaddr는 첨부 주소를 지정하는 것입니다. shmaddr이 NULL인 경우 시스템은 기본적으로 세그먼트를 연결할 적절한 주소를 선택합니다. shmaddr이 NULL이 아니고 SHM_RND가 shmflg에 지정되어 있으면 첨부는 SHMLBA(하위 경계 주소)의 가장 가까운 배수의 주소와 같습니다. 그렇지 않으면 shmaddr공유 메모리 첨부 파일이 발생/시작되는 페이지 정렬 주소여야 합니다. 첫 번째 인수인 키는 공유 메모리 세그먼트를 인식합니다. 키는 임의의 값이거나 라이브러리 함수 ftok()에서 파생될 수 있는 값일 수 있습니다. 키는 IPC_PRIVATE, 즉 서버 및 클라이언트(상위 및 자식 관계) 즉 상호 관련 프로세스 통신으로 프로세스를 실행하는 것을 의미할 수도 있습니다. 클라이언트가 이 키와 함께 공유 메모리를 사용하려면 서버의 자식 프로세스여야 합니다. 또한 부모가 공유 메모리를 얻은 후 자식 프로세스를 만들어야 합니다. shmget(): int shmget (key_t, size_tsize, intshmflg); 성공적으로 완료되면 shmget()은 공유 메모리 세그먼트에 대한 식별자를 반환합니다. 이미 생성된 공유 메모리 세그먼트(shmat()))에 프로세스를 연결하여 읽기 프로세스는 공유 메모리로부터 읽고 표준 출력에 쓰는 공유 메모리는 둘 이상의 프로세스 간에 공유되는 메모리이다. 그러나 메모리 나 다른 통신 수단을 공유해야하는 이유는 무엇입니까? 인수shmaddr은 분리할 공유 메모리 세그먼트의 주소입니다.

분리할 세그먼트는 shmat() 시스템 호출에서 반환되는 주소여야 합니다. 서버와 클라이언트가 현재 디렉터리에 있다고 가정합니다. 서버는 ftok()를 사용하여 키를 생성하고 공유 메모리를 요청하는 데 사용합니다. 공유 메모리가 데이터로 채워지기 전에 상태가 NOT_READY로 설정됩니다. 공유 메모리가 채워진 후 서버는 상태를 채우는 상태로 설정합니다. 그런 다음 서버는 상태가 TAKEN될 때까지 대기하므로 클라이언트가 데이터를 가져온 것입니다. 세 번째 인수인 buf는 구조체 shmid_ds라는 공유 메모리 구조에 대한 포인터입니다. 이 구조의 값은 cmd에 따라 설정하거나 얻을 때 사용됩니다.

쓰기 프로세스는 공유 메모리에 각각 1023바이트씩 `A`에서 `E`로 알파벳의 5배를 씁니다. 마지막 바이트는 버퍼 shmat() 끝을 의미합니다: 공유 메모리 세그먼트를 사용하려면 shmat()를 사용하여 직접 연결해야 합니다. 보이드 *shmat (int shmid, 보이드 * shmaddr, int shmflg); shmid는 공유 메모리 ID입니다. shmaddr는 사용할 특정 주소를 지정하지만 0으로 설정해야하며 OS는 자동으로 주소를 선택합니다. 읽기 프로세스는 공유 메모리에서 읽기를 수행하고 쓰기 프로세스 완료(구조체 shmseg의 전체 변수)가 표시될 때까지 출력에 표시하며 쓰기 완료 후 쓰기 프로세스가 업데이트되어 쓰기 완료를 나타냅니다. 공유 메모리로 (구조체 shmseg의 완전한 변수) 이 장에서는 공유 메모리에 대한 모든 것을 알게 될 것입니다. 총 4개의 데이터 복사본이 필요합니다(읽기 2개 및 쓰기 2개). 따라서 공유 메모리는 둘 이상의 프로세스가 메모리 세그먼트를 공유하도록 하는 방법을 제공합니다. 공유 메모리를 사용하면 입력 파일에서 공유 메모리로, 공유 메모리에서 출력 파일까지 두 번만 데이터가 복사됩니다.

서버 프로그램은 클라이언트에서 사용할 공유 메모리 세그먼트를 할당해야 하므로 클라이언트를 실행하기 전에 서버를 실행해야 합니다.

POST CATEGORIES

Okategoriserade