synchronisation entre processus utilisant des sémaphores non nommés

Dans process-1 , j’essaie d’écrire les données dans la mémoire partagée. En même temps, dans le process-2 je lis les données de la même mémoire partagée. dans ce cas, je dois fournir une synchronisation entre ces deux processus. si je vais passer par des sémaphores sans nom (en utilisant shm_init(),mmap() ), cela fonctionnera-t-il ou non?

J’ai écrit du code comme ça ça va marcher ou pas?

 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); 

    L’approche générale fonctionnera. Notez cependant ce qui suit:

    • L’argument name de shm_open(3) devrait commencer par une barre oblique. Passez "/shm_name" place. (Sous Linux avec glibc, il se trouve que cela fonctionne sans la barre oblique, IIRC.)
    • Vous devez redimensionner fd avec ftruncate(2) ou vous obtiendrez un SIGBUS lorsque vous SIGBUS d’accéder à la mémoire partagée. Chaque fois que vous mmap(2) un fichier, la mémoire à laquelle vous accédez dans le mappage doit réellement exister dans le fichier et les objects de mémoire partagée POSIX fonctionnent de la même manière. (Sous Linux, ils sont implémentés sous la forme de fichiers sous /dev/shm , qui utilise un /dev/shm tmpfs en mémoire.)
    • Si vous envisagez d’utiliser le sémaphore pour synchroniser des opérations sur un mappage de mémoire partagée, il est redondant de créer un mappage de mémoire partagée distinct uniquement pour le sémaphore. Faites-en une partie du mappage sur lequel vous synchronisez les opérations.

    Pour ces derniers, vous pouvez par exemple faire ce qui suit:

     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);