簡體   English   中英

使用未命名信號量的進程之間的同步

[英]synchronization between processes using unnamed semaphores

process-1我試圖將數據寫入共享內存。 同時在process-2我從同一共享內存中讀取數據。 在這種情況下,我需要在這兩個過程之間提供同步。 如果我要通過未命名的信號燈(使用shm_init(),mmap() ),是否可以使用?

我已經編寫了這樣的代碼,不管行不行?

fd = shm_open("shm_name", O_CREAT| O_RDWR, S_IRUSR | S_IWUSR);

sema = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE,MAP_SHARED , fd, 0);

sem_init(sema, 1, 1);

一般方法將起作用。 但是請注意以下幾點:

  • shm_open(3)name參數應以斜杠開頭。 改為傳遞"/shm_name" (在具有glibc的Linux上,它可以在沒有斜線IIRC的情況下正常工作。)
  • 您需要使用ftruncate(2)調整fd大小,否則當您嘗試訪問共享內存時將獲得SIGBUS 每當您mmap(2)一個文件時,您在映射中訪問的任何內存實際上都必須存在於該文件中,並且POSIX共享內存對象的工作方式相同。 (在Linux上,它們被實現為/dev/shm下的文件,該文件使用內存中的tmpfs 。)
  • 如果您打算使用信號量來同步共享內存映射上的操作,那么為信號量創建單獨的共享內存映射是多余的。 使其成為要對其進行同步操作的映射的一部分。

對於后者,您可以執行以下操作:

typedef struct Shared_mem {
    sem_t sem;
    int shared_data[100];
} Shared_mem;

...

shared_mem = mmap(NULL, sizeof(Shared_mem), PROT_READ | PROT_WRITE,
                  MAP_SHARED, fd, 0);

...

sem_init(&shared_mem->sem, 1, 1);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM