golang如何共享或讀取其他進程共享內存? 我檢查了一些信息,但沒有找到相關信息。任何人都可以給我一個例子嗎?如何與Golang共享內存?
-1
A
回答
0
在走的世界裏,不要通過共享內存進行交流;通過通信共享內存。如果你真的想試試,你可以調用C API與CGO:
wrapper.c:
#include <stdlib.h>
#include <string.h>
#include <sys/shm.h>
#include <sys/types.h>
int my_shm_open(char* filename, int open_flag){
int shm_id;
key_t key;
key = ftok(filename, 0x03);
if(key == -1){
return -1;
}
if(open_flag)
shm_id = shmget(key, 4096, IPC_CREAT|IPC_EXCL|0600);
else
shm_id = shmget(key, 0, 0);
if(shm_id == -1){
return -1;
}
return shm_id;
}
int my_shm_update(int shm_id, char* content){
char* addr;
addr = (char*)shmat(shm_id, NULL, 0);
if(addr == (char*)-1){
return -1;
}
if(strlen(content) > 4095)
return -1;
strcpy(addr, content);
shmdt(addr);
return 0;
}
int my_shm_close(int shm_id){
shmctl(shm_id, IPC_RMID, NULL);
return 0;
}
char* my_shm_read(char* filename){
int shm_id;
char* addr;
char* s;
shm_id = my_shm_open(filename, 0);
if(shm_id == -1)
return NULL;
addr = (char*)shmat(shm_id, NULL, 0);
if(addr == (char*)-1){
return NULL;
}
s = (char*)malloc(strlen(addr) + 1);
strcpy(s, addr);
shmdt(addr);
return s;
}
reader.go
package main
// #include <stdlib.h>
// #include "wrapper.c"
import "C"
import "unsafe"
import "fmt"
func read(filename string) string {
f := C.CString(filename)
defer C.free(unsafe.Pointer(f))
s := C.my_shm_read(f)
defer C.free(unsafe.Pointer(s))
return C.GoString(s)
}
func main() {
fmt.Println(read("/tmp"))
}
writter。去:
package main
// #include <stdlib.h>
// #include "wrapper.c"
import "C"
import "unsafe"
import (
"log"
"time"
)
type errorString struct {
s string
}
func (e *errorString) Error() string {
return e.s
}
func open(file string) (int, error) {
f := C.CString(file)
defer C.free(unsafe.Pointer(f))
r := int(C.my_shm_open(f, C.int(1)))
if r == -1 {
return 0, &errorString{"error"}
}
return r, nil
}
func update(shm_id int, content string) error {
c := C.CString(content)
defer C.free(unsafe.Pointer(c))
r := int(C.my_shm_update(C.int(shm_id), c))
if r == -1 {
return &errorString{"update error"}
}
return nil
}
func close(shm_id int) error {
C.my_shm_close(C.int(shm_id))
return nil
}
func main() {
id, err := open("/tmp")
if err != nil {
log.Fatal(err)
}
defer close(id)
err = update(id, "hello world")
if err != nil {
log.Fatal(err)
}
time.Sleep(1e9 * 100)
}
運行作者,然後由go run filename
讀者。 該代碼是從here
-7
golang:它是一種編程語言,所以它不涉及操作系統級共享內存的事情。不是說golang不使用共享內存,但這不是它需要定義的。 Posix使用共享內存,可以使用syscall包,其中包含很多系統調用,只要引用c系統調用接口就行。
相關問題
- 1. Golang,進程和共享內存
- 2. 如何與shm_open共享現有內存?
- 3. C++共享內存泄漏,如何清除共享內存?
- 4. IPC與共享內存的共享內存有什麼區別?
- 5. 共享內存與碼頭
- 6. 雲與共享內存
- 7. 如何分享共享內存?
- 8. 內存共享
- 9. CUDA共享內存
- 10. C共享內存
- 11. 在共享內存
- 12. RDMA內存共享
- 13. 共享內存段
- 14. Linux共享內存
- 15. 通過共享內存共享指針
- 16. 如何在共享內存中得到共享對象
- 17. 如何避免共享內存泄漏
- 18. 如何ElasticSearch和Lucene共享內存
- 19. 如何使用共享內存
- 20. activerecord內存共享緩存
- 21. 多進程python與共享內存
- 22. 與Erlang的C/C++共享內存
- 23. 與System V段錯誤共享內存
- 24. ZeosLib與MYSQL的共享內存協議?
- 25. 共享內存,並與蟒蛇
- 26. 與信號量共享內存同步
- 27. 與OpenACC共享內存的使用
- 28. 使用共享內存與叉()
- 29. 共享內存段vs共享內存段
- 30. 如何與WebView共享圖像緩存
也許您正在尋找內存映射文件? – alexn