現在man手冊裏面看一下inet_ntoa函數的作用吧~
- man⼿冊上說, inet_ntoa函數, 是把這個返回結果放到了靜態存儲區. 這個時候不需要我們⼿動進⾏釋放.(inet_ntoa是一個int_addr轉字符串的函數)
那麼問題來了, 如果我們調⽤多次這個函數, 會有什麼樣的效果呢? 參⻅如下代碼:
運行結果
發現第一次的結果完全被第二次覆蓋了 - 在來看一下多線程情況下的吧
#include<unistd.h>
#include<string.h>
#include<sys/socket.h>
#include<stdio.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<pthread.h>
void* Fun(void* p)
{
struct sockaddr_in* addr = (struct sockaddr_in*)p;
while(1)
{
char* ptr = inet_ntoa(addr->sin_addr);
printf("addr1: %s\n", ptr);
}
return NULL;
}
void* Fun1(void* p)
{
struct sockaddr_in* addr = (struct sockaddr_in*)p;
while(1)
{
char* ptr = inet_ntoa(addr->sin_addr);
printf("addr2: %s\n", ptr);
}
return NULL;
}
int main()
{
pthread_t pid1, pid2;
struct sockaddr_in addr1;
struct sockaddr_in addr2;
int fd;
addr1.sin_addr.s_addr = 0;
addr2.sin_addr.s_addr = 0xffffffff;
fd = pthread_create(&pid1,NULL,Fun,&addr1);
int ff;
ff = pthread_create(&pid2, NULL, Fun1, &addr2);
pthread_join(fd, NULL);
pthread_join(ff,NULL);
return 0;
}
運行結果
直接就崩了!!
原因應該就是inet_ntoa不是線程安全函數吧!