2016-11-26 3 views
0

Я хотел бы иметь общую память между процессами для хранения PID.Глобальный массив для хранения PID. Fork(), Unix procesess, программирование на C

Я создал глобальный массив типа pid_t и использовал fork, созданный новый процесс, в котором я изменил значение элемента массива.

Почему массив в родительском процессе не изменяется, если массив указывает на то же самое?

#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 

pid_t p[1]; 

int main() 
{ 
pid_t f; 

f = fork(); 
if(f == 0) 
{ 
    p[0] = getpid(); 
    printf("Child ... p[0] PID = %d\n", (int)p[0]); 
    printf("points at %ld\n", (long int)p); 
} 
else if (f > 0) 
{ 
    sleep(1); 
    printf("Parent... p[0] PID = %d\n", (int)p[0]); 
    printf("points at %ld\n", (long int)p); 
} 
else 
{ 
    printf("Fork() error \n"); 
    exit(1); 
} 

} 
+0

Общие соображения по использованию 'fork()' 1), ребенок должен быть завершен вызовом 'exit()' 2) родительский элемент перед вызовом должен вызывать 'wait()' или 'waitpid()' so ребенок выходит первым, иначе ребенок становится процессом «зомби», который может быть очень трудно устранить без перезагрузки компьютера. 3) если вы хотите использовать общую память, ознакомьтесь с 'shmat()' 'shmget()' 'shmctl()' 'shmdt()' 'ftok()', поскольку это функции, необходимые для общей памяти – user3629249

ответ

1

Процессы, созданные fork(), не делят память. Созданный новый процесс получает копии вещей в родительском процессе, а не ссылки на существующие данные. На самом деле, ребенок работает в совершенно другом адресном пространстве от родителя. Таким образом, ваш массив p [] - это другой массив в ребёнке, поэтому его изменение не изменяет его в родительском.

Если вы хотите обмениваться памятью между процессами, созданными с помощью fork(), вы можете использовать pipe() для передачи данных в одностороннем порядке, mmap() для отображения области общей памяти или использования другого механизма IPC, доступного в вашей ОС. Вообще говоря, если вам действительно нужно обмениваться памятью, вам лучше использовать потоки, а не процессы.

В качестве опции: использование sleep() не всегда надежно, чтобы произошло событие (в данном случае, изменение p []). Возможно, вы захотите использовать одно из семейств функций wait() в родительском элементе, из-за чего родительский блок блокируется до тех пор, пока ребенок не выйдет.