Отправка сигналов в многопроцессорную систему в C (Linux)

Я создал несколько процессов в цикле и сохранил каждый pid в глобальном массиве. Я думал, что это будет видно всем созданным процессам. Но всякий раз, когда я пытаюсь отправить сигналы с помощью этого массива, все значения кажутся 0 (нулем). Я не знаю, как сделать этот массив видимым и постоянно обновлять для использования всеми процессами. Любая помощь будет оценена по достоинству.

# arrays signals process fork
Источник
  • 0
    В качестве более простой альтернативы рассмотрите возможность использования групп процессов и отправки сигнала сразу всем процессам в этой группе.
Codelisting
за 0 против

forked процессы не разделяют память. Каждый процесс послеfork , функционально будет содержать копию пространства памяти оригинала (это Copy On Write, поэтому он будет скопирован при изменении, но они функционально различны после вилки).

Эти простые примеры показывают, как каждый дочерний элемент может видеть глобальный дочерний массив в своем собственном пространстве процесса , начиная сfork() , но не после этого.

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

#define MCHILD 3
pid_t children[MCHILD];

void print_children(char* prefix){
  for( int i = 0; i < MCHILD; i++){
    printf("%s sees child element %i: %d\n", prefix, i, children[i]);
  }
}

int main() {
  for( int i = 0; i < MCHILD; i++){
    pid_t p = fork();
    if(p == 0){
      printf("Child %d\n", i);
      char * prefix;
      asprintf(&prefix, "\tChild %d", i);
      print_children(prefix);
      exit(0);
    } else {
      children[i] = p;
    }
  }
  print_children("Parent");
}

Вот он работает:

$ gcc -o tc t.c && ./tc
Parent sees child element 0: 41188
Parent sees child element 1: 41189
Parent sees child element 2: 41190
Child 0
    Child 0 sees child element 0: 0
    Child 0 sees child element 1: 0
    Child 0 sees child element 2: 0
Child 1
    Child 1 sees child element 0: 41188
    Child 1 sees child element 1: 0
    Child 1 sees child element 2: 0
Child 2
    Child 2 sees child element 0: 41188
    Child 2 sees child element 1: 41189
    Child 2 sees child element 2: 0
  • 0
    Спасибо за ваш ответ.
  • 0
    Если вам нужна общая память, вы можете использовать потоки вместо процессов или одну из нескольких разделяемых между процессами памяти ( mmap вероятно, самый простой). Но здесь есть свои проблемы, а именно координация доступа к разделяемой памяти. многопроцессорность и межпроцессное взаимодействие - вот где golang ... C, как это типично для языка, без батарей.
Codelisting
Популярные категории
На заметку программисту