2012-08-27 24 views
6

Tôi đang sử dụng shmget để chia sẻ dữ liệu giữa các quy trình của dự án của tôi trên Linux.Các giá trị an toàn được sử dụng làm khóa trong shmget

int shmget(key_t key, size_t size, int shmflg); 

Tuy nhiên, bất kỳ chương trình khác có thể gọi để shmget quá, và do đó nó có thể dẫn đến xung đột quan trọng (vì tôi sử dụng một hằng số là chìa khóa để gọi shmget, tôi phải sử dụng một hằng số thay vì một chìa khóa được tạo ra vì các quy trình bên được xây dựng và chạy riêng).

Giá trị an toàn nào sẽ được sử dụng làm khóa trong chế độ shmget?

Trả lời

5

Tôi đề nghị bạn sử dụng POSIX shm_open (với mmap) thay vào đó, nó không có vấn đề va chạm tồn tại với ftok miễn là bạn không sử dụng cùng một khu vực được đặt tên như phần mềm khác.

6

Không có giá trị an toàn và bạn (và mọi quy trình khác tạo phân khúc được chia sẻ) nên sử dụng IPC_EXCL để đảm bảo không có xung đột. Tuy nhiên, sau này phải đảm bảo rằng các chương trình khác không bắt đầu viết vào phân đoạn của bạn (trừ khi chúng được viết xấu).

Bạn có thể thử tạo khóa 'riêng tư' liên tục tắt ftok() nhưng tốt, bạn biết nó không an toàn. Nếu bạn va chạm với một cái gì đó, bạn sẽ không có cách nào để nói với các chương trình của bạn rằng đây không phải là chìa khóa bên phải. Ngoài ra hãy nhớ rằng:

Chỉ có 8 bit là id có thứ tự thấp. Hành vi của ftok() không xác định nếu các bit này là 0.

Nói cách khác, đừng vượt qua 0 ở đó;).

Trong mọi trường hợp, bạn nên nghiêm túc xem xét việc tạo một số kênh liên lạc. Một tệp duy nhất được viết bởi máy chủ có id là đủ, sau đó sẽ được đọc bởi các chương trình khác.

Từ các ý tưởng khác, bạn có thể thử chuyển qua máy chủ PID dưới dạng id, nếu các quy trình khác có thể nhận được ít nhất điều đó. Điều này có thể làm cho nó an toàn hơn một chút.

+0

Tôi đang nghĩ đến việc tạo các khóa ngẫu nhiên và lặp lại việc tạo phân đoạn shm với cờ IPC_EXCL cho đến khi một khóa có thể chấp nhận được tìm thấy, nhưng tôi không biết đó có phải là tùy chọn hay không – jondinham

+1

@PaulDinh: vâng, đó là một lựa chọn tốt. Vâng, nhưng bạn phải có một cách để tạo ra các khóa ngẫu nhiên, mà không dựa vào 'sizeof (key_t)' cụ thể; Tôi chỉ muốn sử dụng ngẫu nhiên 'id' cho ftok() sau đó. –

+0

Trong trường hợp bạn có một kịch bản client-server trong đó mỗi máy khách duy trì một phân đoạn bộ nhớ chia sẻ cho IPC hiệu quả với máy chủ, một tùy chọn tốt cho các khóa 'shmget()' duy nhất là dựa vào lệnh gọi hệ thống 'gettid()' , trả về ID luồng của người gọi. Tuy nhiên, đây là đặc trưng của Linux. –

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