2011-05-31 71 views
1

考虑下面的C代码:循环mysql_real_connect还是什么

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 

复制连接功能的身体进入主以及去除所述连接 - 功能解决了这个问题。但这不是一个解决方案。

+0

[Hmmmmmmmm](http://dev.mysql.com/doc/refman/5.0/en/mysql-init.html)...尝试'sql_handle = mysql_init(NULL);' – pmg 2011-05-31 14:10:15

+2

我无法看到这可能会产生一个循环。 – 2011-05-31 14:33:51

+1

我很确定,这不是真正的代码。即使'mysql_real_connect'在内部做了一些循环(我认为它没有这样做),连接到数据库被写了好几次。 – 2011-05-31 14:35:11

回答

1

重命名方法

void connect(void) 

void connect_to_database(void) 

解决了这个问题对我来说

0

我认为你需要为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 */ 

} 
+0

不能解决问题。更新我的问题(见上文) – mkind 2011-05-31 16:26:03

1

我认为这个问题是在功能连接(),它具有与连接相同的名称()对于插座:

INT连接(INT的sockfd,const的结构sockaddr *地址,socklen_t addrlen);当链接时,函数mysql_real_connect()需要调用connect()来连接底层套接字,但重新定义的connect()函数被调用,所以会产生循环。

这就是为什么将connect()的名称更改为connect_to_database()解决了问题的原因。

+0

我想知道为什么OP没有得到链接错误? – 2017-03-15 21:41:22

+0

这不一定是错误。您可以根据链接方式重新定义系统功能。链接器不知道你是否故意这样做。 – 2017-03-15 21:55:38