Shared memory between Linux C processes (mathematical operations)

Asked

Viewed 893 times

3

I’m studying shared memory in C language and I need to do a simple program so that a shared variable starts with a value and then the program creates a child process where the variable will be incremented by 2 and then the parent process multiplies the value by 4, I didn’t quite understand how to perform these operations, I saw some examples on the internet but none helped me, someone knows what I’m doing wrong ?

#define _XOPEN_SOURCE 22
#include  <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/shm.h>


int main(){
    //o processo pai e o processo filho compartilhem uma variável simples (por exemplo, inteiro - valor 1)
    int shrd;
    //shrd = 1;
    pid_t childpid;
    int shm_id;
    int *n;

    shm_id = shmget(IPC_PRIVATE, 1024, IPC_CREAT);
         if (shm_id < 0) {
             printf("shmget error\n");
        }
    shrd = shmat(shm_id, 0, 0);

    //o processo pai imprime o valor inicial dessa variável; em seguida, cria o processo filho e espera-o
    printf("O valor da variavel compartilhada é %i\n",shrd);
    childpid = fork();
    printf("o childpid eh %i\n",childpid);
    //o processo filho acessa esta variável, realiza uma operação (por exemplo, adição - valor 2, totalizando 3), modificando o valor; em seguida, o processo filho termina
    if (childpid == 0){
        shrd+= 2;
    }
    else{
        //o processo pai realiza uma outra operação (por exemplo, multiplicação - valor 4, totalizando 12), modificando novamente o valor, e imprime novamente a variável 
        wait();
        shrd *= 4;
        printf("O valor da variavel compartilhada eh %i\n",shrd);    
    }

    return 0;
}
  • what result you are having?

1 answer

0

Solution to the problem: I believe the problem is that I was not using a pointer to the variable that would have the shared memory address, when I made some small modifications, treating it as a pointer, I was able to use it in the correct way, follows the code:

#include  <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/shm.h>


int main(){
    //o processo pai e o processo filho compartilhem uma variável simples (por exemplo, inteiro - valor 1)

    pid_t childpid;
    int shm_id; 

    shm_id = shmget(IPC_PRIVATE, 1024, IPC_CREAT |  0660);
         if (shm_id < 0) {
             printf("shmget error\n");
        }
    // Agora estou tratando a variável como ponteiro, o que facilita todo o resto pelo fato de eu mencionar o endereço de memória que eu quero alterar
    int *shrd = (int*)shmat(shm_id, NULL, 0);


    *shrd = 1;


    //o processo pai imprime o valor inicial dessa variável; em seguida, cria o processo filho e espera-o
    printf("O valor inicial da variavel compartilhada é %i\n",*shrd);
    childpid = fork();
    printf("o childpid eh %i\n",childpid);
    //o processo filho acessa esta variável, realiza uma operação (por exemplo, adição - valor 2, totalizando 3), modificando o valor; em seguida, o processo filho termina
    if (childpid == 0){     
        *shrd+= 2;  

        printf("O valor da variavel compartilhada ao somar 2 eh %i\n",*shrd);    
    }
    else{
        //o processo pai realiza uma outra operação (por exemplo, multiplicação - valor 4, totalizando 12), modificando novamente o valor, e imprime novamente a variável 
        wait(NULL);     
        *shrd *= 4 ;

        printf("O valor da variavel compartilhada ao multiplicar por  4 eh %i\n",*shrd);    

    }


    return 0;
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.