Реализация версии API clone() с использованием fork()Linux

Ответить
Anonymous
 Реализация версии API clone() с использованием fork()

Сообщение Anonymous »

Я работаю над проектом, в котором мне нужно реализовать версию 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() не предоставляет никаких аргументов для стека, нужно ли мне реализовать его самостоятельно или мне нужно использовать межпроцессное взаимодействие?

Подробнее здесь: https://stackoverflow.com/questions/784 ... using-fork
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»