Я создал несколько процессов в цикле и сохранил каждый pid в глобальном массиве. Я думал, что это будет видно всем созданным процессам. Но всякий раз, когда я пытаюсь отправить сигналы с помощью этого массива, все значения кажутся 0 (нулем). Я не знаю, как сделать этот массив видимым и постоянно обновлять для использования всеми процессами. Любая помощь будет оценена по достоинству.
fork
ed процессы не разделяют память. Каждый процесс после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
mmap
вероятно, самый простой). Но здесь есть свои проблемы, а именно координация доступа к разделяемой памяти. многопроцессорность и межпроцессное взаимодействие - вот где golang
... C, как это типично для языка, без батарей.