Отправка сигналов в мультипроцесс в C (Linux) - PullRequest
0 голосов
/ 20 апреля 2020

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

1 Ответ

0 голосов
/ 20 апреля 2020

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

Этот простой пример показывает, как каждый дочерний элемент может видеть глобальный дочерний массив в своем собственном пространстве процессов , начиная с 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
...