зацикливание mysql_real_connect или чего

#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 */

}