#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()).