2013-10-05 12 views
5

Nếu tôi muốn chia sẻ một cái gì đó giống như một mảng char **keys giữa fork() 'quá trình d sử dụng shm_openmmap có thể tôi chỉ dính vào một con trỏ đến keys vào một phân đoạn bộ nhớ chia sẻ hay tôi phải sao chép tất cả dữ liệu trong keys vào phân đoạn bộ nhớ dùng chung?Sharing Pointers Giữa Nhiều Processes Forked

Trả lời

5

Tất cả dữ liệu bạn muốn chia sẻ phải nằm trong phân khúc được chia sẻ. Điều này có nghĩa là cả hai con trỏ và chuỗi phải nằm trong bộ nhớ dùng chung.

Chia sẻ nội dung nào đó bao gồm con trỏ có thể cồng kềnh. Điều này là do mmap không đảm bảo rằng một ánh xạ nhất định sẽ kết thúc trong địa chỉ được yêu cầu.

Bạn vẫn có thể thực hiện việc này bằng hai phương pháp. Trước tiên, bạn có thể thử vận ​​may của mình bằng mmap và hy vọng rằng trình liên kết động không tải thứ gì đó tại địa chỉ ưa thích của bạn.

Phương pháp thứ hai là sử dụng các con trỏ tương đối. Bên trong một con trỏ, thay vì lưu trữ một con trỏ tới một chuỗi, bạn lưu trữ sự khác biệt giữa địa chỉ của con trỏ và địa chỉ của chuỗi. Cũng giống như vậy:

char **keys= mmap(NULL, ...); 
char *keydata= (char*) keys + npointers * sizeof(char*); 
strcpy(keydata, firstring); 
keys[0]= (char*) (keydata - (char*) &keys[0]); 
keydata+= strlen(firststring)+1; 

Khi bạn muốn truy cập vào chuỗi từ quá trình khác, bạn làm ngược lại:

char **keys= mmap(NULL, ...); 
char *str= (char*) (&keys[0]) + (ptrdiff_t) keys[0]; 

Đó là một chút rườm rà nhưng nó hoạt động bất kể lợi nhuận gì mmap.

Các vấn đề liên quan