Difficulty updating global variable. c

I am developing the following code and I am using global variables that can be changed in different parts of the code, but when I change for example the variable state in the function menu() its value is not changed in the other functions that use it, i.e. the variables are global but are not updated. Is it because I'm doing several processes to run all functions simultaneously or am I doing something wrong?

/* menu para acesso as funcionalidades */
#include <wiringPi.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <unistd.h>
#include <stdbool.h>
#include <signal.h>

#define sensoralarme    3
#define saidaalarme     9
#define saidaalarme2   26
#define sensoralarme2 11
#define botaoreset 31
#define saidaclimatizacao 12
#define botaoaumenta 0
#define botaodiminui 2
#define saidajanela1 27 
#define saidajanela2 23
#define abrirjanela 5
#define fecharjanela 4
#define ldr 29



void menu();
void iluminacacao();
void intrusao();
void janelas();
void toggle();
void disparo();
void reset();
void climatizacao();
void toggleclimatizacao();

//int disparo = (digitalRead(sensoralarme));
int estadoalarme;
int estadojanela;
int estadojanela2 = 3 ;
//int *ptr_int = &estadojanela2;
int rr;
 int bright=0 ;
 int state=0;
 int statedisparo=0;
int statedisparo2;
int toggleCount = 0;   // used to count number of falling edges received.
int estadoclimatizacao;
int estadoclimatizacao2;




int main()
{

    int i,r, n=5;
    wiringPiSetup ();
    pinMode (1, PWM_OUTPUT); /* pwm iluminação*/
    pinMode (0, INPUT);/*aumenta luminusidade*/
    pinMode (2, INPUT); /* diminui luminusidade*/
    pinMode (9, OUTPUT); /* saída disparo alarme*/
    pinMode (3, INPUT); /*sensor alarme*/
    pinMode (12, OUTPUT); /*saída climatização */
    pinMode (27, OUTPUT); /*saída janela abrir */
    pinMode (23, OUTPUT); /*saída janela fechar */
    pinMode (29, INPUT);/*ldr*/
    pinMode (5, INPUT); 
    pinMode (4, INPUT); 
    pinMode (6, INPUT);
    pinMode (25, OUTPUT);/*sensir janela aberta */ 
    pinMode (saidaalarme, OUTPUT);
    pinMode (saidaalarme2, OUTPUT);
    pinMode (sensoralarme, INPUT);
    pinMode (sensoralarme2, INPUT);
    pinMode (botaoreset, INPUT);
    digitalWrite(saidaalarme2, LOW);
    digitalWrite(saidaalarme, LOW);
    digitalWrite(saidaalarme,0);
    digitalWrite(saidaclimatizacao,0);
    digitalWrite(saidajanela1,0);
    digitalWrite(saidajanela2,0);
    //pwmWrite (1, 0);
    printf("Bem Vindo.\n"); 
    printf("Pressione OK para continuar\n");
    getchar();
    r=fork();
    if(r==0)
    {
        printf(" \n.....A iniciar sistemas iluminacao\n \n ");
        iluminacao();
        exit(0);
    }
    r=fork();
    if(r==0)
    {
        printf(" \n.....A iniciar sistemas intrusao \n \n ");
        intrusao();
        exit(0);
    }
    r=fork();
    if(r==0)
    {
        printf(" \n.....A iniciar sistemas  climatizacao\n \n ");
        climatizacao();
        exit(0);
    }
    r=fork();
    if(r==0)
    {
        printf(" \n.....A iniciar sistemas janelas \n \n ");
        janelas();
        exit(0);
    }
    delay (500);
    system( "clear" );
    menu();

    /*for(i=0; i<n; i++)
    {

        if(fork()) break;
    }

    if(i==n)
    {
        menu();

    }
    else
    {
        printf(" \n.....A iniciar sistemas \n \n ");
    }
    switch(i)
    {
        case 1:
        {
            iluminacao();
            break;
        }
        case 2:
        {
            intrusao();
            break;
        }
        case 3:
        {
            climatizacao();
            break;
        }
        case 4:
        {
            janelas();
            break;
        }
    }*/

 /*int r;
 r=fork();
 if (r==0)
 {iluminacao();intrusao();climatizacao();janelas();}
 else
 {menu();}
    return 0;*/


}

void menu()
{
    int escolha1;
    int r;
    int estadoclimatizacao;
    int lum;
    int estadointrusao;


    //printf(" estado janela2:%d\n",  *ptr_int);
    printf("SISTEMAS \n");
    printf("\n");
    printf("Escolha umas das seguintes opções:\n");
    printf("1. iluminação.\n");
    printf("2. Intrusão.\n");
    printf("3. Climatização.\n");
    printf("4. Janelas.\n");
    printf("0. Sair.\n");
    scanf("%d", &escolha1);
    switch ( escolha1 )
    {
        case 1:
        {
            printf("intruduza o nivel de luminusidade desejado de 0 a 10 \n");
            scanf("%d", &lum);
            bright=lum*102.4;
            printf("%d: lum\n",bright);
            pwmWrite (1, bright);
            menu();
            break;
        }
        case 2:
        {
            printf(" Para ligar prima 1\n Para desligar prima 0\n");
            scanf("%d", &estadointrusao);
            if (estadointrusao==1 && state ==0)
            {
                digitalWrite(saidaalarme, HIGH);
                state=1;
                menu();
                break;
            }
            else if (estadointrusao==1 && state ==1)
            {
                printf(" Sistema já se encontra ligado!\n");
                menu();
            }
            if (estadointrusao==0 && state == 1 && statedisparo == 0)
            {
                digitalWrite(saidaalarme, LOW);
                state=0;
                menu();
                break;
            }
            else if (estadointrusao==0 && state ==0)
            {
                printf(" Sistema já se encontra desligado!\n");
                menu();
            }
            else if (estadointrusao==0 && state ==1 && statedisparo == 0)
            {
                printf(" Sistema terá de ser desligado localmente!\n DISPARO\n");
                menu();
            }
        }
        case 3:
        {
            printf(" Para ligar prima 1\n Para desligar prima 0\n");
            scanf("%d", &estadoclimatizacao);
            if ( estadoclimatizacao == 1 )
            {
                digitalWrite(saidaclimatizacao,1);
                menu();
            }
            if ( estadoclimatizacao == 0 )
            {
                digitalWrite(saidaclimatizacao,0);
                menu();
            }
        }
        case 4:
        {
            printf(" Para abrir prima 1\n Para fechar prima 0\n Para verificar o estado prima 2\n");
            scanf("%d", &estadojanela);
            if (estadojanela ==2 && estadojanela2 ==1)
                {
                    printf("janela ABERTa \n");
                    menu();
                }
            if (estadojanela==2 && estadojanela2 == 0)
                {
                    printf("janela fechada \n");
                    menu();
                }
            if (estadojanela !=2 && rr==0)
            {




                    menu();
                    //sleep(600);



            }
            else 
            {
                printf("passar para processo ja aberto \n");
                menu();
            }
        }   

        case 0:
        {
            kill(0, SIGTERM);
            /*comando para matar todos os processos criados*/
            digitalWrite(saidaalarme2, LOW);
        digitalWrite(saidaalarme, LOW);
        digitalWrite(saidaalarme,0);
        digitalWrite(saidaclimatizacao,0);
        digitalWrite(saidajanela1,0);
        digitalWrite(saidajanela2,0);
        pwmWrite (1, 0);
            return (0);
            break;
        }
    }

}

void iluminacao()
{

  //int buttonmais = (digitalRead(0) );
  int buttonmenos = (digitalRead(2) );


  printf ("dimmer\n") ;

  if (wiringPiSetup () == -1)
    exit (1) ;


  pwmWrite (1, bright);


  while (1)
  {


      while (digitalRead(0) != LOW && digitalRead(2) == LOW && digitalRead(29) !=0)
      {

          if (bright  < 1024 && bright >= 0)
        {
        bright = bright+1;  
        pwmWrite (1, bright) ;
        delay (4) ;

        }
        }
    while ( digitalRead(2) != LOW && digitalRead(0) == LOW && digitalRead(29) !=0)
    {
        if (bright  <= 1024 && bright > 0)
        {
            bright = bright-1;
        pwmWrite (1, bright) ;
        delay (4) ;
        }
    }

    if (digitalRead(0) != LOW && digitalRead(2) != LOW)
      {
          bright = 0;
          pwmWrite (1, bright);
      }
}


}


void janelas()
{
    while (1)
    {
        if ( estadojanela == 1 && digitalRead(25)==0 )/*abre janela via linha de comandos*/
                {
                    digitalWrite(saidajanela1,1);
                    digitalWrite(saidajanela2,0);
                    delay(500);
                    estadojanela2 = 1;
                    estadojanela=3;
                    printf("ABERTO \n");
                    digitalWrite(saidajanela1,0);
                    digitalWrite(25,1);

                }
                if ( estadojanela == 0 && digitalRead(25)==1)/* fecha janela via linha de comandos*/
                {
                    digitalWrite(saidajanela1,0);
                    digitalWrite(saidajanela2,1);
                    delay(500);
                    estadojanela2=0;
                    estadojanela=3;
                    printf("Fechado \n");
                    digitalWrite(saidajanela2,0);
                    digitalWrite(25,0);

                }
                if ( estadojanela == 1  && (digitalRead(saidajanela1)==1)  )/*para abertura de janela*/
                {
                    digitalWrite(saidajanela1,0);
                    digitalWrite(saidajanela2,0);


                    printf("ABERTura parada \n");



                }
                if ( estadojanela == 0  && (digitalRead(saidajanela2)==1)  )/*para fecho da janela*/
                {
                    digitalWrite(saidajanela1,0);
                    digitalWrite(saidajanela2,0);


                    printf("fecho parada \n");



                }
                if ( digitalRead(5)!=0 && digitalRead(25)==0 )/*abre janela via linha de comandos*/
                {
                    digitalWrite(saidajanela1,1);
                    digitalWrite(saidajanela2,0);
                    delay(500);
                    estadojanela2 = 1;
                    estadojanela=3;
                    printf("ABERTO \n");
                    digitalWrite(saidajanela1,0);
                    digitalWrite(25,1);

                }
                if ( digitalRead(4)!=0 && digitalRead(25)==1)
                {
                    digitalWrite(saidajanela1,0);
                    digitalWrite(saidajanela2,1);
                    delay(500);
                    estadojanela2=0;
                    estadojanela=3;
                    printf("Fechado \n");
                    digitalWrite(saidajanela2,0);
                    digitalWrite(25,0);

                }
    }

}

void intrusao()
{
    if (wiringPiISR(sensoralarme,INT_EDGE_FALLING,&toggle) != 0)
    {
        printf("Registering ISR failed\n");
        return 2;
    }
    if (wiringPiISR(sensoralarme2,INT_EDGE_FALLING,&disparo) != 0)
    {
        printf("Registering ISR failed\n");
        return 2;
    }
    if (wiringPiISR(botaoreset,INT_EDGE_FALLING,&reset) != 0)
    {
        printf("Registering ISR failed\n");
        return 2;
    }
    if ( saidaalarme == 1 && sensoralarme2 == 1)
    {
        digitalWrite(saidaalarme2, HIGH);
        delay(10);
    }

    // wait for ever so the program doesn't terminate.
    while(1)
    {


        // Yield the thread so CPU doesn't run 100%
        delay(5000);
    }
}

void toggle()
{

    // NOTE: LED is connected to +3.3V and to the PIN.
    // So configuration is active low. 
    if(state==1 && statedisparo ==0)
    {
        // Set -ve lead of LED to ground.
        digitalWrite(saidaalarme,LOW);
        state = 0;
        printf("%d: ALARME OFF\n", toggleCount++);
    }


    else
    {
        // Set -ve lead of LED to +3.3V.
        digitalWrite(saidaalarme, HIGH);
        state = 1;
        printf("%d: ALARME ON\n", toggleCount++);
    }

}
void disparo()
{
    //statedisparo = 0;
    if(state==1 && statedisparo==0)
    {
        // Set -ve lead of LED to ground.
        digitalWrite(saidaalarme2,LOW);
        statedisparo = 1;
        statedisparo2 = 1;
       // printf("%d: disparo off\n", toggleCount++);

    /*  do
    {
            digitalWrite (LedPin2, HIGH) ; delay (300) ;
        digitalWrite (LedPin2, LOW) ; delay(300) ;
    }
    while (state==1);*/



        while(statedisparo2==1)
        {


            digitalWrite (saidaalarme2, HIGH) ; delay (300) ;
            digitalWrite (saidaalarme2, LOW) ; delay(300) ;


        }


    }
    else if(state==0 && /*ButtonPin2 ==1*/ statedisparo == 0)
    {
        // Set -ve lead of LED to +3.3V.
        digitalWrite(saidaalarme2, HIGH);
        //statedisparo = 1;
        printf("%d: ALARME OFF\n", toggleCount++);
        printf("%d: disparo ON\n", toggleCount++);
        digitalWrite (saidaalarme2, HIGH) ; delay (500) ;
        pwmWrite (1, 256);
        digitalWrite (saidaalarme2, LOW) ;


    }


}
void reset()
{
    if(state == 1)
    {
        // Set -ve lead of LED to +3.3V.
        digitalWrite(saidaalarme2, LOW);
        digitalWrite(saidaalarme, LOW);
        //statedisparo = 1;
        printf("%d: RESET\n", toggleCount++);
        state=0;
        statedisparo=0;
        statedisparo2=0;
        return;


    }
}   

void climatizacao()
{
    //int flag=0;
    printf("climatização\n");

    if (wiringPiISR(digitalRead(6),INT_EDGE_FALLING,&toggleclimatizacao) != 0)
    {
        printf("Registering ISR failed\n");
        return 2;
    }
    while (1)
    {
        //if (digitalRead(6)!=0 && estadoclimatizacao2==0 && flag==0)
        //{
            //digitalWrite(saidaclimatizacao,1);
            //flag=1;
        //  estadoclimatizacao2=1;
        //}
        //if (digitalRead(6)!=0 && estadoclimatizacao2==1 && flag ==1)
        //{
            //digitalWrite(saidaclimatizacao,0);
            //flag=0;
        //  estadoclimatizacao2=0;
        //}
         delay(5000);

    }
}

void toggleclimatizacao()
{

    if(estadoclimatizacao==1 && statedisparo ==0)
    {

        digitalWrite(saidaclimatizacao,LOW);
        estadoclimatizacao = 0;
        printf(" climatizacao OFF\n");
    }


    else
    {
        // Set -ve lead of LED to +3.3V.
        digitalWrite(saidaclimatizacao, HIGH);
        estadoclimatizacao = 1;
        printf("climatizacao ON\n");
    }

}
Author: Guilherme Nascimento, 2017-11-28

1 answers

The fork function duplicates all in-memory data from the parent process, including global variables. So if you change a variable in one of the processes, the change will not be reflected in the others.

You have to use some memory sharing mechanism between processes to achieve this goal, or create threads instead of processes, which would have access to the global variables of the process that created them.

Link in English, if help: https://stackoverflow.com/questions/13274786/how-to-share-memory-between-process-fork

 1
Author: luislhl, 2017-11-28 02:52:04