зацикливание mysql_real_connect или что - PullRequest
1 голос
/ 31 мая 2011

рассмотрите следующий код 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 established\n");
  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

Копирование тела функции соединения в основную и удаление функции соединения решает проблему. но это не решение.

Ответы [ 3 ]

1 голос
/ 02 июня 2011

переименование метода

void connect(void)

до

void connect_to_database(void)

решил эту проблему для меня

1 голос
/ 16 марта 2017

Я думаю, что проблема была в функции connect (), которая имеет то же имя, что и connect () для сокетов:

int connect (int sockfd, const struct sockaddr * addr, socklen_t addrlen);

При связывании функции mysql_real_connect () необходимо вызвать connect (), чтобы подключить базовый сокет, но вместо этого вызывается переопределенная функция connect (), и поэтому создается цикл.

Именно поэтому изменение имени connect () на connect_to_database () решило проблему.

0 голосов
/ 31 мая 2011

Я думаю, вам нужен реальный объект для дескриптора 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(&sql_handle); /* use address */

  fprintf(stdout,"connecting to database..\n");
  mysql_real_connect(&sql_handle,NULL,NULL, /* use address */
                      NULL,"test",0,NULL,0);

  fprintf(stdout,"connection established\n");
  mysql_close(&sql_handle); /* use address */

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...