2012-05-21 34 views
11

Tôi muốn chia sẻ một biến giữa nhiều hơn một tệp thi hành C độc lập trong Linux. Tức là, một chương trình sẽ viết trên một mảng và thiết lập một cờ để không chương trình nào khác có thể sử dụng nó, và sau khi thao tác này nó sẽ hủy bỏ cờ và sau đó chương trình khác sẽ đọc mảng đó. Tôi đã thử sử dụng cùng một tệp tiêu đề tùy chỉnh (có chứa biến) trong mỗi chương trình, nhưng có vẻ như các phiên bản khác nhau của các biến được tạo khi các chương trình được gọi.Chia sẻ cùng một biến giữa nhiều chương trình độc lập trong Linux

+8

gợi ý: IPC (Interprocess Communication), nó quá lớn là một chủ đề để giải quyết trong một câu trả lời ở đây. – Nim

+2

Có, bạn có thể muốn xem [tại đây] (http://en.wikipedia.org/wiki/Inter-process_communication). Hai tệp thực thi độc lập được khởi chạy trong các quy trình khác nhau, vì vậy bạn sẽ phải triển khai một số loại giao tiếp giữa chúng, sử dụng [socket] (http://www.cs.cf.ac.uk/Dave/C/node28.html) , [đường ống] (http://www.cs.cf.ac.uk/Dave/C/node23.html), v.v ... hoặc thậm chí cả tệp. –

+0

Tôi hiểu. Điều đó có nghĩa, ống phải được sử dụng trong trường hợp này. Có cách nào đơn giản hơn không? –

Trả lời

14

Các biến bạn khai báo trong phần đầu của bạn sẽ tạo một bản sao mà bạn đã bao gồm chúng (unless you declare them extern). Tất nhiên, khi giao dịch với các quy trình riêng biệt, mọi quy trình sẽ có không gian bộ nhớ riêng. Bạn cần phải sử dụng các kỹ thuật tinh vi hơn để vượt qua điều này, tức là Giao tiếp giữa các quá trình liên lạc (IPC). Ví dụ:

  • (tên) Ống
  • Sockets
  • Shared Memory

Câu hỏi của bạn đọc như shared memory là những gì bạn muốn, vì hướng nhiều quy trình có thể truy cập vào các khu vực bộ nhớ cùng chia sẻ một số biến. Có thể hãy xem this question và câu trả lời của nó cho một ví dụ.

Chương trình của bạn sẽ được yêu cầu tạo một số bộ nhớ dùng chung, ví dụ: sử dụng shmget và để đính kèm đối tượng bộ nhớ dùng chung bằng cách sử dụng shmat. Khi nhiều quá trình truy cập vào cùng một vùng bộ nhớ, đó luôn là một cách tiếp cận lành mạnh để thêm đồng bộ hóa quá trình trong khi đọc/ghi trên biến, ví dụ: sử dụng một semaphore dùng chung (semget, semop).

Khi bạn đã hoàn tất bộ nhớ dùng chung, bạn cần tách (shmdt) khỏi nó. Qua đó bạn nói với hạt nhân rằng quá trình của bạn không còn cần truy cập vào nó nữa. Quá trình tạo bộ nhớ chia sẻ/đối tượng semaphore cũng cần phải tiêu diệt chúng ở cuối (các) chương trình của bạn. Nếu không, nó sẽ nằm trong bộ nhớ, có thể cho đến khi bạn khởi động lại máy của bạn (xem shmctl, semctl, đặc biệt là IPC_RMID).

Lưu ý rằng đối với các đối tượng bộ nhớ dùng chung "Phân đoạn sẽ chỉ thực sự bị hủy sau khi quá trình cuối cùng xóa nó". Vì vậy, bạn muốn chắc chắn rằng điều này thực sự xảy ra cho tất cả các quy trình của bạn (shmdt).


Để đối phó với các ý kiến, đây là cách tiếp cận POSIX:

System V bộ nhớ chia sẻ (shmget (2), shmop (2), vv) là một bộ nhớ chia sẻ API cũ. Bộ nhớ chia sẻ POSIX cung cấp giao diện được thiết kế đơn giản và tốt hơn; Mặt khác, bộ nhớ chia sẻ POSIX có phần ít phổ biến hơn (đặc biệt là trên các hệ thống cũ hơn) so với bộ nhớ dùng chung của System V.

  • shm_open - để có được bộ nhớ (thông qua bộ mô tả tập tin)
  • ftruncate chia sẻ - để thiết lập kích thước của bộ nhớ chia sẻ
  • mmap - để có được một con trỏ tới bộ nhớ
  • sem_open - để nhận được semaphore
  • sem_wait, sem_post - để đồng bộ hóa đọc/ghi
  • shm_unlink, sem_close - để làm sạch sau khi tất cả

Xem thêm this overviewhere cho ví dụ.

Cuối cùng, lưu ý rằng

POSIX chia sẻ đối tượng bộ nhớ có kiên trì hạt nhân: một đối tượng bộ nhớ chia sẻ sẽ tồn tại cho đến khi hệ thống được tắt, hoặc cho đến khi tất cả các quá trình có unmapped đối tượng và nó đã bị xóa với shm_unlink (3)


để đưa vào tài khoản sự tồn tại của các đối tượng bộ nhớ chia sẻ, đừng quên để thêm bộ xử lý tín hiệu để ứng dụng của bạn mà sẽ thực hiện các hoạt động dọn dẹp trong trường hợp ngoại lệ al chấm dứt (SIGINT, SIGTERM vv).

+3

Không sử dụng 'shmget', sử dụng dấu phẩy' shm_open' để thay thế. điều này là ít đau đớn hơn để sử dụng, và không có vấn đề va chạm chính – Hasturkun

+0

@ Hasturkun - Cảm ơn bạn đã bình luận! Tôi đã không sử dụng cho đến nay, nhưng tôi đã thêm một lưu ý về điều này cho đầy đủ. – moooeeeep

+0

Cảm ơn moooeeeep. –

6

Nhìn vào sử dụng POSIX bộ nhớ chia sẻ qua shm_openshm_unlink ... Cá nhân tôi cảm thấy họ được dễ dàng hơn để sử dụng và nhiều hơn nữa thẳng về phía trước so với cũ System-V IPC gọi như shmget, vv từ tay cầm quay trở lại hoạt động chính xác giống như một bộ mô tả tập tin mà bạn có thể sử dụng với các cuộc gọi như read, write, v.v. Nếu không, nếu bạn muốn truy cập đối tượng bộ nhớ dùng chung được mô tả bởi bộ mô tả tập tin thông qua con trỏ bình thường, bạn có thể sử dụng mmap trên bộ mô tả tập tin được trả về bởi shm_open .

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