简体   繁体   中英

Shared memory linux

I'm trying to work with shared memory at the first time. I created one child process and I write to the shared memory from Parent and change it from Child, before program ends I print shared memory from Parent and shared memory hasn't change, here is my code:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>

#include <semaphore.h>
#include <fcntl.h>
#include <sys/shm.h>
#include <signal.h>

sem_t *semaphore;


int main(){

    int i = 0, status;
    pid_t pid=fork(), w;

    int id;
    if ((id = shmget(IPC_PRIVATE, sizeof(int), IPC_CREAT | 0666)) == -1){
        perror("shmget");
        exit(1);
    }
    int *sh;
    if ((sh =(int *) shmat(id, NULL, 0)) == NULL){
        perror("shmat");
        exit(1);
    }
    *sh = 10;

    if ((semaphore = sem_open("/semaphore", O_CREAT, 0666, 0)) == SEM_FAILED){
        perror("semaphore");
        exit(1);
    }

    if (pid==0) {
         while(1){
            sleep(1);
            *sh = 50;
            printf("child %d, %d\n", i, *sh);
            i++;
            if(i == 5){
                sem_post(semaphore);
                exit(0);
            }
         }

    } else if (pid==-1) {
        perror("process error\n");
    } else {
        printf("Parent, %d\n", *sh);
        sem_wait(semaphore);
        printf("child end => parent end\n");
        printf("Parent, %d\n", *sh);
    }


    shmctl(id, IPC_RMID, NULL);
    sem_close(semaphore);
    sem_unlink("/semaphore");

    return 0;
}

If I understand shared memory little bit than I can change it from everywhere if I have a pointer in my case is a "sh".

Output of program is:

Parent, 10
child 0, 50
child 1, 50
child 2, 50
child 3, 50
child 4, 50
child end => parent end
Parent, 10

Why is the number in shared memory different in Parent and in Child?

You fork() before you create the shared memory with the key IPC_PRIVATE , so both processes create their own shared memory and don't actually share it.

If you remove the =fork() from

pid_t pid=fork(), w;

and insert

pid = fork();

somewhere after the shmget call, it works the way you expect, since the child process will inherit the shared memory identifier from the parent and not create a different one.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM