LINUX.ORG.RU

деление на ноль и сигфолт, без падения программы


0

0

возник вопрос уместно ли подобное (для программы которая должна работать постоянно)?

#include <iostream>
#include <cstring>
#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>


using namespace std;

static int X = 6666;

void Be_easy()
{

pid_t piit;
if (piit = fork())
{
cout << "in base: " << X <<endl;
int status = 0;
waitpid(piit, &status, 0);
cout << "base end: " << status << endl;
Be_easy();

}
else
{
///основной код программы выполняемый при работе
////....

////гдето в глубине происходит сигфоолт/исключенийе/деление на ноль
X = 7777;
cout << "derived: "<< X << endl;
///sleep(1);
int* x=0;
*x = 223;
cout << "derived end: " << endl;
}
}


int main()
{
///некие действия открытие создание/файлов, создание обьектов, вобшем все то что происходит при старте программы

Be_easy();

return 0;
}


не совсем понимаю термина 'уместно' в данном контексте.

// wbr

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

ну да но программа то работает (т.е перезапускается) а вообще читайте вопрос

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

>int* x=0; >*x = 223; >^^^^^^^^^

Было приведено в качестве примера какой-то опирации которая обычно кончает програму

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

Вполне.
Вот цитата из википедии (Erlang):
"Важный принцип работы процесса формулируется как «let it crash» («пусть процесс упадет»). Вместо перехвата ошибок и попытки продолжения работы, часть программы, содержащая рискованный код, выделяется в отдельный «процесс-смертник», и этот процесс делает всё возможное, чтобы система убила его в случае возникновения ошибки, а процесс-родитель готов получать сообщения о смерти таких подпроцессов и обрабатывать их."
И небольшое замечание - в коде вместо рекурсии в Be_easy() лучше все-таки цикл вроде
for(;;)
Be_easy();
в этом случае не расходуется стек

capricorn20
()

Почему бы и нет? Только лучше сделать 

for (;;)
{
	if (fork())
	{
		wait(...);
	}
	else
	{
		CodeToCrash;
	}
}

vnovouhov
()

>деление на ноль и сигфолт

разрешаю проверить но ноль до деления и до сигфолта не доводить

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

> разрешаю проверить но ноль до деления и до сигфолта не доводить

+1, только хотел спросить, что мешает добавить проверку

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

> и почему try() .. catch() в Си не придумали? :)

И что оно в твоём случае даст? Деление на нуль и сегфолт - это сигналы, посылаемые процессу ядром, к семантике языка никакого отношения не имеют. Некоторые особо умные языки, типа лиспа, такие ошибки перехватывают и генерируют исключение, но Си не имеет права так высоко над базовой платформой подниматься.

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

>> и почему try() .. catch() в Си не придумали? :)

> И что оно в твоём случае даст? Деление на нуль и сегфолт - это сигналы, посылаемые процессу ядром, к семантике языка никакого отношения не имеют. Некоторые особо умные языки, типа лиспа, такие ошибки перехватывают и генерируют исключение, но Си не имеет права так высоко над базовой платформой подниматься.

Вместа пиара лиспа не по делу сказал бы, что в С есть setjmp() в паре с longjmp() вместо try() .. catch(). А если ты этого не знаешь, то помолчи пожалуста про С.

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