Как обмениваться памятью между процессом fork()?
В fork child, если мы изменим глобальную переменную, она не будет изменена в основной программе.
Есть ли способ изменить глобальную переменную в дочерней вилке?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int glob_var;
main (int ac, char **av)
{
int pid;
glob_var = 1;
if ((pid = fork()) == 0) {
/* child */
glob_var = 5;
}
else {
/* Error */
perror ("fork");
exit (1);
}
int status;
while (wait(&status) != pid) {
}
printf("%d\n",glob_var); // this will display 1 and not 5.
}
Ответы
Ответ 1
Вы можете использовать общую память (shm_open()
, shm_unlink()
, mmap()
и т.д.).
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
static int *glob_var;
int main(void)
{
glob_var = mmap(NULL, sizeof *glob_var, PROT_READ | PROT_WRITE,
MAP_SHARED | MAP_ANONYMOUS, -1, 0);
*glob_var = 1;
if (fork() == 0) {
*glob_var = 5;
exit(EXIT_SUCCESS);
} else {
wait(NULL);
printf("%d\n", *glob_var);
munmap(glob_var, sizeof *glob_var);
}
return 0;
}
Ответ 2
Изменение глобальной переменной невозможно, потому что новый созданный процесс (дочерний элемент) имеет собственное адресное пространство.
Поэтому лучше использовать shmget()
, shmat()
из POSIX
api
Или Вы можете использовать pthread
, так как pthreads
делят данные global
, а изменения глобальной переменной отражаются в родительском.