簡體   English   中英

Mmap和結構

[英]Mmap and structure

我正在使用信號量來編寫一些代碼,包括進程之間的通信。 我做了這樣的結構:

typedef struct container {
    sem_t resource, mutex;
    int counter;
} container;

並以這種方式使用(在主應用中和下屬流程中相同)

container *memory;

shm_unlink("MYSHM"); //just in case
fd = shm_open("MYSHM", O_RDWR|O_CREAT|O_EXCL, 0);

if(fd == -1) {
    printf("Error");
    exit(EXIT_FAILURE);
}
memory = mmap(NULL, sizeof(container), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
ftruncate(fd, sizeof(container));

當我使用sem_函數之一時一切都很好,但是當我嘗試執行類似的操作時

memory->counter = 5;

沒用 指針可能出了點問題,但是我嘗試了幾乎所有操作,但似乎沒有任何效果。 也許有更好的方法在進程之間共享變量,結構等? 不幸的是,我不允許使用boost或類似的東西,該代碼是出於教育目的,我希望盡可能地保持簡單。

因為您在shm_open()之前立即使用shm_unlink() ,所以兩個進程永遠不會打開相同的共享內存對象-每個進程都在創建一個新的,不同的對象(即使它們具有相同的名稱)。


您不清楚“無效”是什么意思。 以下基於您的代碼的最小示例對我來說很好用。 它為您做什么?

#include <stdio.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <semaphore.h>

typedef struct container {
    sem_t resource, mutex;
    int counter;
} container;

int main()
{
    container *memory;
    int fd = shm_open("MYSHM", O_RDWR|O_CREAT|O_EXCL, 0);

    if(fd == -1) {
        perror("shm_open");
        return 1;
    }

    ftruncate(fd, sizeof(container));
    memory = mmap(NULL, sizeof(container), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);

    memory->counter = 5;
    printf("%d\n", memory->counter);

    return 0;
}

在檢查代碼時,它失敗了,因為您試圖在exec()之后訪問子進程中的文件描述符,並且shm_open默認情況下設置FD_CLOEXEC標志,因此文件描述符不再在子進程中打開。 因此,您只需要在主進程中取消設置該標志(例如,在shm_open之后檢查錯誤之后):

fdflags = fcntl(fd, F_GETFD);
fdflags &= ~FD_CLOEXEC;
fcntl(fd, F_SETFD, fdflags);

為什么根本要打電話給shm_open? 一個很好的方法是在某個路徑名上調用“ open”並使用它。

暫無
暫無

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

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