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_open
và mmap
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
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.
- 1. ThreadPool của CLI Processes
- 2. Pip install forked github-repo
- 3. Malloc và Void Pointers
- 4. SLCOmposeviewcontroller twitter sharing alert issue
- 5. Python: Chạy Daemon Processes trong Windows7
- 6. Pointers và lặp trong C
- 7. Sharing Text File sử dụng ACTION_SEND
- 8. Pointers cho các thành viên cơ quan đại diện
- 9. Pointers như các đối số trong hàm C
- 10. dữ liệu Sharing Core và hình ảnh để iCloud
- 11. Forked IORef chức năng đọc dường như chững lại chủ đề chính
- 12. Sharing phiên trên đường ray ứng dụng trên các tên miền phụ khác nhau
- 13. Căn giữa nhiều trẻ DIV
- 14. Việc bật Keychain Sharing có làm thay đổi AppID của bạn không?
- 15. iOS 8 PhotoKit. Nhận hình ảnh có kích thước tối đa từ album iCloud Photo Sharing
- 16. Mối quan hệ giữa nhiều mối quan hệ giữa nhiều mô hình
- 17. JPA: Quan hệ nhiều-nhiều giữa hai thực thể?
- 18. Có thể mô tả các ổ cắm được chuyển đổi thành File Pointers không?
- 19. Đối tượng giả bị rò rỉ khi sử dụng GoogleMock cùng với Boost :: Shared Pointers
- 20. Dịch chỉ 4 dòng mã từ khách quan c để nhanh chóng (Pointers)
- 21. C++ sử dụng Smart Pointers với thay đổi con trỏ đánh giá cao
- 22. Pointers để giải quyết nhiệm vụ lập trình động đầy thử thách này
- 23. Giao tiếp giữa nhiều máy chủ
- 24. ios - Điều hướng giữa nhiều NavigationControllers
- 25. Vượt qua một biến giữa nhiều UIVIewControllers
- 26. Python Sự khác biệt giữa một quy trình của Hồ bơi công nhân và chỉ chạy nhiều Quy trình là gì?
- 27. Làm thế nào để tìm và diệt các chiến dịch chạy Win-Processes từ bên trong Java?
- 28. Sử dụng git trong Windows, tùy chọn - sharing có dùng git-init làm bất cứ điều gì hữu ích không?
- 29. Làm thế nào để tạo bản vá giữa hai thẻ với nhiều cam kết giữa chúng?
- 30. Làm cách nào để tạo liên lạc giữa nhiều miền giữa JavaScript và Flash?