nixp.ru v3.0

20 января 2017,
пятница,
23:17:57 MSK

DevOps с компанией «Флант»
Any_Key написал 24 июня 2006 года в 18:46 (319 просмотров) Ведет себя как мужчина; открыл 31 тему в форуме, оставил 325 комментариев на сайте.

У меня приятель учится на программера им задали написать программу которая форкает а потом дитё убивает родителя.

Мне стало интересно.

Интересовался я долго и вот что получилось

#include 
#include 
#include 
#include 
#include 
int main(){
    if (!fork()) {
        kill (getppid(),SIGKILL);
        exit (0);
    } else {
        wait (NULL);
    }
exit (0);
}


Собственно интересует, а как это же можно сделать по другому? (Элегантнее?)

ЗЫ. Это мне интересно, приятель пусть сам мучается.

Feuerbach

Если именно убивает, то наверное, как-то так.

Просто обычно родитель сам умирает:

fork() && exit(0);

PS Это я попробовал перенести на C Perl-овую идиому

fork and die;


, но она тут, увы, не работает:

error: void value not ignored as it ought to be

Ну, в любом случае что-то вроде

if (fork()) exit(0);
Any_Key

Не, нужен был именно форк с комплексом Эдипа.

Как вариант наверное можно ещё handler в родителя вставить. Чтоб мог воскликнуть «помогите убивают»

Longobard

Страсти-мордасти прям…

А вобще, если мне не изменяет память, при убийстве процесса убиваются все его дочерние процессы. Т.е. если мы прибьем родителя — то и сами умрем. Такая вот грустная история, хныык :(

rgo
Any_Key
Собственно интересует, а как это же можно сделать по другому? (Элегантнее?)

чёт я не понял… чем тебе этот вариант не нравиться?

Если парент имеет X окошко, то можно закрыть это окно. или убить X.

Но это для парента со специфическими свойствами. а других способов общего назначения я, как-то и не вижу…

Хотя имея права рута, можно поразвлекаться с /dev/mem (главное не испортить, случайно, себя, init или ядро породившее init). Есть ещё файлик /proc//mem, зачем он — не знаю, но возможно позволит из без рута насрать в память папы.

Но зачем нужны эти извраты, когда есть kill?

rgo
Longobard
Страсти-мордасти прям…

А вобще, если мне не изменяет память, при убийстве процесса убиваются все его дочерние процессы. Т.е. если мы прибьем родителя — то и сами умрем. Такая вот грустная история, хныык :(

изменяет ;) С кем интересно.

Any_Key

2 Longobard

Нет, если дитю есть чем заняться то оно благополучно переживёт родителя, так рождаются демоны.

2 rgo

эээ проблема в том что я-то совсем не программист, и Си практически не знаю, просто искал может есть еще какой способ который я упустил, а варианты с ковырянием в /dev/mem — действительно изврат.

Longobard

Да, покурил Стивенса, я неправ :)

rgo
Longobard
Да, покурил Стивенса, я неправ :)

ык. курил говоришь? а стивенс ничего не говорил про сигнал который чайлд ловит после убийства папы? Чтоб проверить, не умрёт ли, случайно чайлд следом за парентом, я скормил gcc

if (!fork()) {
        kill (getppid(),SIGKILL);
        usleep (1000);
        printf ("Я папоубийца!\n");
        exit (0);
    } else {
        wait (NULL);
    }

Дык usleep, по-ходу дела, прерывался сигналом. Вот каким сигналом? SIGCHLD?

Feuerbach
rgo
Дык usleep, по-ходу дела, прерывался сигналом. Вот каким сигналом? SIGCHLD?

SIGCHLD — наоборот, оповещает об умершем сыне.

Попробуй узнать о сигнале по exit code, который равен 128+номер сигнала.

Feuerbach

rgo, у меня этот код отрабатывает на ура. Ищи проблемы в консерватории ;)

rgo
Feuerbach
rgo, у меня этот код отрабатывает на ура. Ищи проблемы в консерватории ;)

угу, нашёл.

точно: никаких сигналов не ловит и висит в usleep ровно столько, сколько сказано, безо всяких EINTR.

я просто перепутал микросекунды с миллисекундами :).

ecobeingecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.