现在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不是线程安全函数吧!