boucler mysql_real_connect ou quoi

considérez le code c suivant:

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); } 

cela produit la sortie suivante

 ... 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) 

la fonction real_connect semble avoir des problèmes. le démon fonctionne à coup sûr. ça fait longtemps que je n’étais pas habitué à c alors c’est peut-être une question stupide.

[mise à jour] voici le code complet

  1 #include  2 #include  3 4 #if defined __WIN32__ || _MSC_VER 5 #include "my_global.h" 6 #include "mysql.h" 7 #else 8 #include  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 } 

ce code produit cette sortie:

 ... connecting to database.. initializing database handle.. connecting to database.. initializing database handle.. connecting to database.. closing connection.. [1] 12914 segmentation fault (core dumped) ./db 

copier le corps de la fonction connect dans main et supprimer les fonctions connect résout le problème. mais ce n’est pas une solution.

renommer la méthode

 void connect(void) 

à

 void connect_to_database(void) 

résolu ce problème pour moi

Je pense que le problème était dans la fonction connect (), qui porte le même nom que connect () pour les sockets:

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

Lors de la liaison, la fonction mysql_real_connect () doit appeler connect () pour connecter le socket sous-jacent, mais la fonction redefined connect () est appelée à la place et la boucle est produite.

C’est pourquoi changer le nom de connect () en connect_to_database () a résolu le problème.

Je pense que vous avez besoin d’un object réel pour le handle SQL

 int main (int argc, char *argv[]) { MYSQL *sql_handle; /* create object */ sql_handle = malloc(sizeof *sql_handle); /* ... */ /* release object */ free(sql_handle); } 

ou

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