LINUX.ORG.RU

[Unix] Как завершить родителя до завершения потомка.

 


0

0

В универе в рамках курса по Unix даны задания на лабу, скажу скажу, что предлагать смотреть в лекциях смысла нет, лекций нет, предмет оставлен на самостоятельное обучение.

Задание

Процесс 1 открывает файл и порождает потомка 2, после этого пишет в файл N байт, закрывает его и завершается. Потом процесс 2 пишет N байт в файл, закрывает файл и завершается. Для определения очередности записи использовать функцию fstat. 

Код (см. ниже) как и я ожидал не работает

#include  <unistd.h>
#include  <stdio.h>

int main(int argc, char* argv[])
{
    pid_t pid;

    pid=fork();

    if (pid==0)
    {
        waitpid(getppid(), NULL,0);
        printf("Завершился дочерний процесс\n");
    }
    if (pid!=0)
    {
        sleep(2);
        printf("Завершился родительский процесс\n");
    }


    _exit(0);
}

★★★★★
Ответ на: комментарий от Boy_from_Jungle

Нет, конечно. Если это невозможно, что-то мне подсказывает что это так, то так и скажи.

Dudraug ★★★★★
() автор топика

Ну что за народ пошел. Тебе же неприкрытым текстом намекнули: мол, используй fstat в цикле, пока размер файла не увеличится на N байт. Если неохота в цикле, man 2 pipe и на досуге подумать, как и почему pipe + fork + close + read могут использоваться для оповещения о смерти процесса.

linuxfan
()
Ответ на: комментарий от Boy_from_Jungle

Собственно должен сначала завершиться родительский потом дочерний. С соответствующими сообщениями на экране.

Может лучше указать куда копать? Или сказать возможно или нет, пробежался по манам и книжке Стивенса, не нашел. wait по идее ждет дочернего процесса завершения, так что я понимаю, что код бред, но другого возможного решения даже теоретически я не нашел.

Dudraug ★★★★★
() автор топика
Ответ на: комментарий от linuxfan

Стоп, тут прямым текстом сказано, что родитель завершается до заверения потомка. При чем тут fstat?

Dudraug ★★★★★
() автор топика

Как бы код - это не выполненное задание. Это всего лишь попытка понять момент с родителем/потомком.

Dudraug ★★★★★
() автор топика

Для определения очередности записи использовать функцию fstat.


Он наверное намекал чтобы ты посмотрел на время изменения файла,
кто раньше - тот и первый?!

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

>...и завершается. Потом...

Тут задание русским языком написано, я этого момента не понимаю.

Dudraug ★★★★★
() автор топика
Ответ на: комментарий от Boy_from_Jungle

Я знаю, что код бред, можешь не чешить свое ЧСВ обсиранием других, я и так знаю, что там полная чушь написана. Но задание есть задание, если читать задание, то по идее на момент когда процесс 2 начинает запись в файл, процесс 1 должен быть завершен.

Dudraug ★★★★★
() автор топика
Ответ на: комментарий от yltsrc

По идее же при завершение родителя завершается и потомок, если это не так, то я хочу увидеть пример такого кода, вот и все. Вопрос только в этом, как работать с fstat я и так понимаю.

Dudraug ★★★★★
() автор топика

Все разобрался, на самом деле, потом и не погибает при завершение родителя. Пример в ОП-посте был бредом. Там походу в любом случае если предок завершился до потомка, потом все равно завершается.

Dudraug ★★★★★
() автор топика

just workaround

можно записать дейстивие на сообщение о завершении 2го процесса - запись того, что надо. Тогда всё будет как описано.

qnikst ★★★★★
()

При завершении родительского дочерний не завершается. Так что для примера можешь в дочернем ждать сигнала от родительского. Пусть родительский на выходе и посылает этот сигнал. Например, через atexit().

MuZHiK-2 ★★★★
()

Извращенцы.

Deleted
()
Ответ на: комментарий от isden

Как я понял, тут не тот случай. По идее процесс лишившейся родителя переходит под опеку init, когда он (дочерний) завершается init должен побеспокоиться о погребении. Разве не так?

Dudraug ★★★★★
() автор топика
Ответ на: комментарий от isden

>It is important to note that every process becomes zombie for a brief amount of time when it exits, usually a split second, as a part of its natural life cycle.

Не, это я уже понял. Но зомби все равно закопан будет.

Dudraug ★★★★★
() автор топика
Ответ на: комментарий от isden

Конечно видел. Но как я понял, при завершение родителя раньше потомка init удочеряет процесс. Чтобы процесс был неубиваемый, родитель должен не обрабатывать сигнал о завершение, init по идее все обрабатывает.

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