LINUX.ORG.RU

рухнет ли вся программа?

 


0

2

Я начал тестировать создал nlor .

Программа иногда завершалась с ошибкой, только я незнаю с какой, и она рушилась редко. Поэтому я решил этот функционал завернуть в fork. Программу пока тестирую. Может кто знает. Что будет если процесс завершиться, ну по непонятной ошибке. А именно вот это

if ( ( pid = fork ( ) ) == 0 ) {
 ...  <---
} else {
 waitpid ( pid, &status, 0 );
}
Остальная часть программы будет работать и сможет создать новый процесс?

Если форк процесса упадёт, родительский процесс получит SIGCHLD. У этого сигнала действие — ign, так что не упадёт.

А вообще, бороться с падениями можно минимум двумя путями — работая над качеством кода либо маскируя эти самые падения, чтобы юзер не увидел. Игры с форком — это второй путь, в то время как по-хорошему надо идти первым

XMs ★★★★★
()

Серьёзно?

#define REQUEST 1024
#define RESPONSE 16385
#define NET_DATA 16384
#define COOKIE 128
#define JSESSION 128
#define PARAMS 1024
#define REMEMBER_ME 128

void md_init ( struct manipulation_data *md )
{
	md->request = malloc ( REQUEST );
	md->response = malloc ( RESPONSE );
	md->cookie = malloc ( COOKIE );
	md->jsession = malloc ( JSESSION );
	md->params = malloc ( PARAMS );
	md->remember_me = malloc ( REMEMBER_ME );
}
anonymous
()
Ответ на: комментарий от anonymous

Для него вывод инициализации в отдельную функцию — уже прогресс. Подожди, ещё дойдёт очередь до инициализации выделенной памяти, адекватным именам и работой с возвращаемыми значениями

XMs ★★★★★
()

1) Веди логи и смотри где упало

2) Шо за magic numbers?

#define REQUEST 1024
#define RESPONSE 16385
#define NET_DATA 16384
#define COOKIE 128
#define JSESSION 128
#define PARAMS 1024
#define REMEMBER_ME 128

void md_init ( struct manipulation_data *md )
{
	md->request = malloc ( REQUEST );
	md->response = malloc ( RESPONSE );
	md->cookie = malloc ( COOKIE );
	md->jsession = malloc ( JSESSION );
	md->params = malloc ( PARAMS );
	md->remember_me = malloc ( REMEMBER_ME );
}

3) Ну и при каком условии у тебя if(md->request) вернет false? Я ни одного присвоения NULL туда не увидел.

void md_free_all ( struct manipulation_data *md )
{
	if ( md->request ) free ( md->request );
	if ( md->response ) free ( md->response );
	if ( md->cookie ) free ( md->cookie );
	if ( md->jsession ) free ( md->jsession );
	if ( md->params ) free ( md->params );
	free ( md );
}

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

Ну и при каком условии у тебя if(md->request) вернет false? Я ни одного присвоения NULL туда не увидел

Теоретически, NULL может вернуть malloc(), но лулз в том, что проверка тут вообще не нужна, free() корректно обрабатывает NULL

XMs ★★★★★
()

Еще realloc принимает NULL как указатель. Вообще как минимум интересно почитать описание стандартной библиотеки.

Программа иногда завершалась с ошибкой, только я незнаю с какой

$ gcc -g main.c -o main
$ gdb main
run
bt
q
$

linuhs_user
()

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

struct foo {
    char string1[100500];
    char string2[1024];
    char string3[473432];
};

и так далее и не аллоцирует её одним махом?

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

советовать создавать структуры в Си после разговоров про утечку памяти, вы знатные рофлиры конечно

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

Я код в репозитории не смотрел, только то, что тут выкладывали, поэтому судить о том, кто и откуда вызывался, не могу. Если не вызывалась — что ж, значит, утечек гораздо больше

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

Очень бегло посмотрел. Семейство функций md_* имеет смысл убрать в отдельный модуль, в md_clear_all не делаешь memset() для remember_me, да и вообще читать сложно, много функций, которые по логике должны быть как-то сгруппированы, но на деле просто лежат кучей. Разнесение по файлам согласно зонам ответственности увеличит читаемость на порядок

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

Лучше по моему переписать в программку для консоли юзая советы что тебе написали + curl + убрав одинаковые куски. Тогда каждый сможет прикрутить к своей системе. И можно будет наделать кучу фронтендов.

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

man 3 free

Функция free() освобождает место в памяти, указанное в ptr, которое должно быть получено ранее вызовом функции malloc(), calloc() или realloc(). Иначе (или если вызов free(ptr) уже выполнялся) дальнейшее поведение не определено. Если значение ptr равно NULL, то не выполняется никаких действий.

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

Ололо, эксперт нарисовался. Хочет ТС пердолится? Пожалуйста. Почему не подсказать, как это сделать проще?

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