Я работаю над проектом, в котором мне нужно реализовать версию API clone() с использованием fork(). Исходный контекст функции — это реализация создания рабочего процесса на основе потоков. Вот исходный код:
int bkwrk_create_worker() {
unsigned int i;
for (i = 0; i < MAX_WORKER; i++) {
void ** child_stack = (void ** ) malloc(STACK_SIZE);
unsigned int wrkid = i;
pthread_t threadid;
sigset_t set;
int s;
sigemptyset( & set);
sigaddset( & set, SIGQUIT);
sigaddset( & set, SIGUSR1);
sigprocmask(SIG_BLOCK, & set, NULL);
/* Stack grow down - start at top*/
void * stack_top = child_stack + STACK_SIZE;
wrkid_tid[i] = clone( & bkwrk_worker, stack_top,
CLONE_VM | CLONE_FILES,
(void * ) & i);
usleep(100);
return 0;
}
Однако, когда я пытаюсь заменить clone() на fork(), я сталкиваюсь с проблемой. Данные между родительским и дочерним процессом не совпадают. Если worker назначен родительскому процессу, то всякий раз, когда он нужен дочернему процессу, его задача равна NULL.
Я понимаю, что fork() создает новый процесс с копией родительской памяти, поэтому изменения в родительской памяти после fork() не влияют на дочерний элемент. Однако метод clone() с флагом CLONE_VM позволяет дочернему и родительскому процессу совместно использовать память, поэтому изменения в одном процессе видны в другом.
Как добиться аналогичного поведения с помощью fork()? Есть ли способ поделиться определенными данными между родительским и дочерним процессом, созданным fork()?
Я уже ссылался на следующий вопрос. Я узнал, что оба API fork() и clone() использовали системный вызов clone(), но API fork() не предоставляет никаких аргументов для стека, нужно ли мне реализовать его самостоятельно или мне нужно использовать межпроцессное взаимодействие?
Я работаю над проектом, в котором мне нужно реализовать версию API clone() с использованием fork(). Исходный контекст функции — это реализация создания рабочего процесса на основе потоков. Вот исходный код: [code]int bkwrk_create_worker() { unsigned int i;
for (i = 0; i < MAX_WORKER; i++) { void ** child_stack = (void ** ) malloc(STACK_SIZE); unsigned int wrkid = i; pthread_t threadid;
usleep(100); return 0; } [/code] Однако, когда я пытаюсь заменить clone() на fork(), я сталкиваюсь с проблемой. Данные между родительским и дочерним процессом не совпадают. Если worker[i] назначен родительскому процессу, то всякий раз, когда он нужен дочернему процессу, его задача равна NULL. Я понимаю, что fork() создает новый процесс с копией родительской памяти, поэтому изменения в родительской памяти после fork() не влияют на дочерний элемент. Однако метод clone() с флагом [b]CLONE_VM[/b] позволяет дочернему и родительскому процессу совместно использовать память, поэтому изменения в одном процессе видны в другом. Как добиться аналогичного поведения с помощью fork()? Есть ли способ поделиться определенными данными между родительским и дочерним процессом, созданным fork()? Я уже ссылался на следующий вопрос. Я узнал, что оба API fork() и clone() использовали системный вызов clone(), но API fork() не предоставляет никаких аргументов для стека, нужно ли мне реализовать его самостоятельно или мне нужно использовать межпроцессное взаимодействие?