LINUX.ORG.RU

общие данные у родителя и потомка


0

0

у родителя есть переменная, объявленная в main. В этот же main делается fork(),  и потомок через некоторое время проверяет эту переменную, которую родитель у себя уже изменил. Проблема в том, что потомок не видит изменения.

Я понимаю в чем проблема, однако знаний устранить проблему быстро не хватает. Подскажите, как можно решить.

main () {
    int var = 0;

    if ( fork() == 0) {
         sleep(2)
         if (var == 0)
           kill(getppid(), SIGKILL);
           exit(0);
    }

    var = 1;
    sleep(10);
}

В итоге, родитель будет убит.

При простом форке память копируется по COW (copy on write) посмотри в сторону clone (CLONE_VM) или потоковчто почти то же самое.

programmer
()

Либо треды надо юзать, либо var объявлять volatile и в общую память сажать (лучше всего mmap c MAP_ANONYMOUS и MAP_SHARED)

Die-Hard ★★★★★
()
Ответ на: комментарий от programmer

а можете привести пример ?
боюсь, как бы не совершить ошибки. Я не очень силен в таких вещах:
int clone(int (*fn)(void *), void *child_stack, int flags, void *arg);

nial
() автор топика
Ответ на: комментарий от Die-Hard

треды, да, верно, помогут.

тут то вот что: я пытаюсь сделать что-то типа таймера - если родитель не сделал действие за 2 секунды - остановить его, чтобы он не тупил вечно.

nial
() автор топика

Возможно, есть смысл использовтаь семаформы.

anonymous
()
Ответ на: комментарий от nial

> я пытаюсь сделать что-то типа таймера - если родитель не сделал действие за 2 секунды - остановить его, чтобы он не тупил вечно.

Однозначно -- сигнал, и никаких трэдов!

Если надо что-то посложнее, но в том же духе (ну, чтобы папа с сыном поговорить могли), я обычно прокидываю пару пайпов перед форком.

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

да, спасибо. alarm годится.

да отож, раз в полгода сядешь писать такие строки кода, а опыта нет.... спасибо что бы хот отвечаете ?

nial
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.