關於inet_ntoa的覆蓋問題

現在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不是線程安全函數吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章