LINUX.ORG.RU

fork+exec, exit, _Exit, деструктор


0

0

Из программы надо запустить другую. В связи с этим есть два вопроса.
Вопросы про linux.

1. Корректно ли делать fork+exec из одного из thread-ов?

2. Скажем есть такая программа:

class C1
{
public:
	C1() { printf("подписаться на события\n"); }
	~C1() { printf("отписаться от событий\n"); }
	int get_message() { return 0; };
};

C1 c1;

int main(void)
{
	pid_t pid = -1;
	
	pid = fork();
	if(0 == pid)
	{
		execl("/wrong_path", "/wrong_path");
		exit(1);
	}
	
//	while(0 == c1.get_message())
//	{
//		printf("do something\n");
//	}
		
	return 0;
}

Тут еще надо добавить обработчик SIGCHILD, чтоб зомби не оставались.

Если exec по какой-то причине не выполнится, то произойдет следущее:
[vasya@vasya 0]$ ./a.out
подписаться на события
отписаться от событий
отписаться от событий

Вместо exit пишу _Exit, то деструкторы не вызываются и всё происходит так как мне надо.
[vasya@vasya 0]$ ./a.out
подписаться на события
отписаться от событий

Корректно ли здесь использовать _Exit? Насколько я понимаю, вся выделенная память должна автоматически освобождаться при завершении процесса?
Ответ на: комментарий от vasirck

> 1. Корректно ли делать fork+exec из одного из thread-ов?

вполне, только имей ввиду что ехeс в ребёнке уничтожит все треды ребёнка и создаст один новый тред. Далее всё можно начинать сначала

кстати а зачем тебе exit??? я чтото непонял

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

>Корректно ли здесь использовать _Exit?

вполне. ето ребёнок который не имеет никакого отношения к родительским классам.

>Насколько я понимаю, вся выделенная память должна автоматически освобождаться при завершении процесса?

а ей больше некуда деватся.

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

> кстати а зачем тебе exit??? я чтото непонял

Если exec по какой-то причине не выполнится, как в приведенном примере, то что делать, кроме как exit?

vasirck
() автор топика
Ответ на: комментарий от cvv

Ну да, main можно и return, то же самое, что exit получится.

Спасибо

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

Насчет _Exit():

Правило таково: при применении форка допустим только один exit() (или return() из main()). Обычно его делает Самый Толстый Папа, но, в принципе, все равно, кто именно его сделает.

Все остальные должны делать _exit(), а перед этим самостоятельно отслеживать возможные накладки (типа нефлэшнутых буферов).

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

Нужно понимать, что при fork произойдет, например, копирование буферов уровня stdio и все, что еще не попало в файл, имеет все шансы попасть туда дважды.

Но сформулированное правило про допустимость только одного exit() я бы счел [неоправданно] сильным утверждением.

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

ЦеПП: деструкторы глобальных обьектов и:

Временные файлы.

Короче, я согласен с тем, что утверждение излишне ... э-э-э ... сильное. Но, факт: чтобы не поиметь геммороя, надо делать _exit() и разгребаться вручную.

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