2011-05-31 117 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