#mysql #c
#mysql #c
Вопрос:
рассмотрим следующий код на c:
int main (int argc, char *argv[]) {
MYSQL *sql_handle;
fprintf(stdout,"initializing handle..n");
sql_handle = mysql_init(sql_handle);
fprintf(stdout,"connecting to database..n");
mysql_real_connect(sql_handle,NULL,NULL,
NULL,"test",0,NULL,0);
fprintf(stdout,"connection establishedn");
mysql_close(sql_handle);
}
это приводит к следующему результату
...
initializing handle..
connecting to database..
initializing handle..
connecting to database..
initializing handle..
connecting to database..
initializing handle..
connecting to database..
connection established
Error: Can't create UNIX socket (24)
похоже, у функции real_connect проблемы. демон запущен наверняка. прошло много времени с тех пор, как я привык к c, так что это может быть глупый вопрос.
[обновление] вот полный код
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 #if defined __WIN32__ || _MSC_VER
5 #include "my_global.h"
6 #include "mysql.h"
7 #else
8 #include <mysql.h>
9 #endif
10
11 /* prototypes */
12 void connect(void);
13
14 /* sql handle */
15 MYSQL *sql_handle;
16
17 int main (int argc, char *argv[]) {
18 fprintf(stdout,"main..n");
19 connect();
20 return EXIT_SUCCESS;
21
22 }
23 void connect(void){
24 fprintf(stdout,"initializing database handle..n");
25 sql_handle = mysql_init(NULL);
26
27 fprintf(stdout,"connecting to database..n");
28 mysql_real_connect(sql_handle,NULL,NULL,NULL,NULL,0,NULL,0);
29
30 fprintf(stdout,"closing connection..n");
31 mysql_close(sql_handle);
32 }
этот код выдает этот вывод:
...
connecting to database..
initializing database handle..
connecting to database..
initializing database handle..
connecting to database..
closing connection..
[1] 12914 segmentation fault (core dumped) ./db
копирование тела функции connect в main и удаление функций connect решает проблему. но это не решение.
Комментарии:
1. Хмммммммм … попробуйте
sql_handle = mysql_init(NULL);
2. Я не понимаю, как это может привести к циклу.
3. Я почти уверен, что это не настоящий код. Даже если
mysql_real_connect
внутри выполняется какой-то цикл (чего я не думаю, что он делает),connecting to database
записывается несколько раз.4. @киров я тоже об этом думаю
5. @pmg тоже не работает
Ответ №1:
переименование метода
void connect(void)
Для
void connect_to_database(void)
решил эту проблему для меня
Ответ №2:
Я думаю, проблема была в функции connect (), которая имеет то же имя, что и connect () для сокетов :
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
При связывании функция mysql_real_connect() должна вызывать connect(), чтобы подключить базовый сокет, но вместо этого вызывается переопределенная функция connect(), и таким образом создается цикл.
Вот почему изменение имени connect () на connect_to_database() решило проблему.
Комментарии:
1. Это не обязательно ошибка. Вы можете переопределить системные функции, если хотите, в зависимости от способа подключения. Компоновщик не знает, делаете ли вы это специально.
Ответ №3:
Я думаю, вам нужен реальный объект для дескриптора sql
int main (int argc, char *argv[]) {
MYSQL *sql_handle;
/* create object */
sql_handle = malloc(sizeof *sql_handle);
/* ... */
/* release object */
free(sql_handle);
}
или
int main (int argc, char *argv[]) {
MYSQL sql_handle; /* create object, not pointer */
fprintf(stdout,"initializing handle..n");
mysql_init(amp;sql_handle); /* use address */
fprintf(stdout,"connecting to database..n");
mysql_real_connect(amp;sql_handle,NULL,NULL, /* use address */
NULL,"test",0,NULL,0);
fprintf(stdout,"connection establishedn");
mysql_close(amp;sql_handle); /* use address */
}