Собственно, сабж. Система FreeBSD.
В главном потоке создается коннект к БД.
Затем создаются дочерние. Все работает нормально.
Запросы к базе проходят успешно. Но в какой-то момент,
непонятно почему, при вызове mysql_query(&mysql, sql_str)
в дочернем потоке возникает broken pipe и программа вылетает.Делал даже так:
try{
if (mysql_query(&mysql, sql_str)) exit(3);
}
catch(MYSQL &mysql){
puts("Error mysql_query!");
exit(-1);
}
catch(char *sql_str){
puts("Error sql_str!");
exit(-1);
}исключение не ловится. Непонятно, прикаких обстоятельствах возникают
проблемы. Причем они возникают, когда в программе всего 1 дочерний
процесс. То есть никакой нагрузки нет. В чем может быть проблема?
>Собственно, сабж. Система FreeBSD.
>В главном потоке создается коннект к БД.
>Затем создаются дочерние. Все работает нормально.
>Запросы к базе проходят успешно. Но в какой-то момент,
>непонятно почему, при вызове mysql_query(&mysql, sql_str)
>в дочернем потоке возникает broken pipe и программа вылетает.
>
>Делал даже так:
> try{
> if (mysql_query(&mysql, sql_str)) exit(3);
> }
> catch(MYSQL &mysql){
> puts("Error mysql_query!");
> exit(-1);
> }
> catch(char *sql_str){
> puts("Error sql_str!");
> exit(-1);
> }
>
>исключение не ловится. Непонятно, прикаких обстоятельствах возникают
>проблемы. Причем они возникают, когда в программе всего 1 дочерний
>процесс. То есть никакой нагрузки нет. В чем может быть проблема?Исключения и не будут ловится ... мускул написан на с(не с++) и он не бросает исключений и почуме ты ловишь "char *sql_str", если в коде try нигде не делаешь throw "WTF?" ?
>>в дочернем потоке возникает broken pipe и программа вылетает.
SIG_PIPE может кидаться в нескольких случаях. Один из них, если не ошибаюсь, закрытие удаленной стороной сокета во время accept; еще если ты пишешь в сокет, а другая сторона закрыла соединение, т.е. это нормальная ситуация.Повесь пустой обработчик на сигнал SIG_PIPE и не заморачивайся, все равно функции работы с сокетами тебе стандартную ошибку вернут.