Как заставить дочерние и родительские процессы манипулировать одной и той же глобальной переменной?

#c #linux #signals #ipc

#c #linux #сигналы #ipc

Вопрос:

У меня есть логическая переменная «ab», для которой установлено значение false, но я хочу изменить ее на true в функции, которую выполняет дочерний процесс. Я пытался использовать каналы, но я не знал, что именно делать и как. кто-нибудь может мне помочь, пожалуйста?

код создает 2 дочерних процесса и входит в бесконечный цикл отправки сигналов обоим дочерним процессам после 3 секунд использования alarm(3) .

 #include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <stdbool.h>
#include <sys/wait.h>
#include <string.h>
#include <signal.h>

void passage(int);
void AB(int);
void BA(int);

bool ab = true;

int pid[2];
int i = 1;

void
passage(int signum)
{
    printf("Voiture %d passéen", i);
    i  ;
    ab = !ab;
}

void
AB(int sig)
{

    if (ab == false) {
        printf("feu1: ROUGE | feu2: VERTn");
        ab = true;
    }
}

void
BA(int sig)
{

    if (ab == true) {
        // ab = false;
        printf("feu1: VERT | feu2: ROUGEn");
    }
}

int
main()
{

    struct sigaction action;

    action.sa_handler = passage;
    sigaction(SIGALRM, amp;action, NULL);

    pid[0] = fork();
    if (pid[0] != -1) {
        if (pid[0] == 0) {
            // Code du child 1
            printf("test1n");
            signal(SIGUSR1, AB);
            while (1);

        }
        else {
            pid[1] = fork();
            if (pid[1] == 0) {
                // Code child 2
                printf("test2n");
                signal(SIGUSR2, BA);
                while (1);

            }
            else {
                // parent precessus
                // send signals to the two childs after 3s
                printf("PONT OUVERTn");

                for (;;) {
                    alarm(3);
                    pause();
                    kill(pid[0], SIGUSR1);
                    kill(pid[1], SIGUSR2);

                }
                // gcc test.c -o test
            }
        }
    }

    return 0;
}
  

Комментарии:

1. Вам нужно использовать общую память, взгляните на shmemXXX функции.

2. Вы хотите, чтобы отправлялись [бесконечные] сигналы? Или это часть проблемы? Чтобы разделить память между родительским и дочерним, в parent [before fork ] используйте shmget et. al. [SysV IPC].

3. Лучшим решением может быть семафор.

4. Вы можете использовать потоки вместо процессов. Тогда глобальное пространство памяти будет разделено между всеми потоками (см. pthread_create()).