공유 메모리 작업
공유 메모리는 시스템에서 제공하는 mmap 함수를 사용합니다. 이 함수는 가상 메모리의 한 구역에 파일을 비추고 프로그램은 바늘로 이 구역을 인용합니다. 이 메모리 구역에 대한 동작은 파일로 되돌아갑니다. 함수의 원형은 다음과 같습니다.
void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);
겸사겸사 shmopen 및 shmunlink 의 두 가지 함수:
shm_open () 함수 기능: 공유 메모리 헤더 파일을 열거나 만듭니다: #include
이 문서의 설명을 참고하여 mmap과 같은 함수를 더욱 이해할 수 있습니다.http://www.cnblogs.com/polestar/archive/2012/04/23/2466022.html
골랑이 cgo를 호출하는 방법을 이용하여 c의 mmap을 실현할 수 있다.실험은 읽기와 쓰기 두 프로그램으로 나뉘는데, 이로써 읽기 프로세스가 공유 메모리에 쓴 정보를 읽을 수 있음을 관찰할 수 있다.
shm_writer.go 코드 예:
package main
/*
#cgo linux LDFLAGS: -lrt
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
int my_shm_new(char *name) {
shm_unlink(name);
return shm_open(name, O_RDWR|O_CREAT|O_EXCL, FILE_MODE);
}
*/
import "C"
import (
"fmt"
"unsafe"
)
const SHM_NAME = "my_shm"
const SHM_SIZE = 4 * 1000 * 1000 * 1000
type MyData struct {
Col1 int
Col2 int
Col3 int
}
func main() {
fd, err := C.my_shm_new(C.CString(SHM_NAME))
if err != nil {
fmt.Println(err)
return
}
C.ftruncate(fd, SHM_SIZE)
ptr, err := C.mmap(nil, SHM_SIZE, C.PROT_READ|C.PROT_WRITE, C.MAP_SHARED, fd, 0)
if err != nil {
fmt.Println(err)
return
}
C.close(fd)
data := (*MyData)(unsafe.Pointer(ptr))
data.Col1 = 100
data.Col2 = 876
data.Col3 = 8021
}
shm_reader.go 코드 예:package main
/*
#cgo linux LDFLAGS: -lrt
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
int my_shm_open(char *name) {
return shm_open(name, O_RDWR, FILE_MODE);
}
*/
import "C"
import (
"fmt"
"unsafe"
)
const SHM_NAME = "my_shm"
const SHM_SIZE = 4 * 1000 * 1000 * 1000
type MyData struct {
Col1 int
Col2 int
Col3 int
}
func main() {
fd, err := C.my_shm_open(C.CString(SHM_NAME))
if err != nil {
fmt.Println(err)
return
}
ptr, err := C.mmap(nil, SHM_SIZE, C.PROT_READ|C.PROT_WRITE, C.MAP_SHARED, fd, 0)
if err != nil {
fmt.Println(err)
return
}
C.close(fd)
data := (*MyData)(unsafe.Pointer(ptr))
fmt.Println(data)
}
위의 프로그램은 mmap이 실제 4G 메모리를 차지하지 않고 가상 메모리를 사용했다는 것을 증명하기 위해 4G의 가상 메모리를 비추었다.shm_writer가 공유 메모리를 만든 후 메모리 영역에 구조체를 썼습니다.shmreader는 구조체를 읽습니다.
위 코드에서shm 와 같은 cgo의 기교를 사용했다open과 mmap 함수는 오류가 발생할 때errno를 되돌려줍니다. go에서 다중 되돌려주기 문법을 사용하면 cgo는 오류 코드를 오류 정보로 변환하여 편리한 기능을 제공합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.