一、参考glic中对应函数的实现glibc源码地址https//ftp.gnu.org/gnu/glibc我下载了2.31版本参考ifaddrs.c ifaddrs.h文件中代码实现。二、代码实现1、新增/source/os/include/services/posix/sys/ifaddrs.hstruct ifaddrs{struct ifaddrs *ifa_next; /* Next item in list */char *ifa_name; /* Name of interface */unsigned int ifa_flags; /* Flags from SIOCGIFFLAGS */struct sockaddr *ifa_addr; /* Address of interface */struct sockaddr *ifa_netmask; /* Netmask of interface */union{struct sockaddr *ifu_broadaddr; /* Broadcast address of interface */struct sockaddr *ifu_dstaddr; /* Point-to-point destination address */} ifa_ifu;#define ifa_broadaddr ifa_ifu.ifu_broadaddr#define ifa_dstaddr ifa_ifu.ifu_dstaddrvoid *ifa_data; /* Address-specific data */};2、新增/source/os/service/posix/pse53/netdb/pse52_ifaddrs.cINT getaddrs(struct ifaddrs **ifap){}三、问题记录1、struct if_nameindex{INT32 if_index;CHAR *if_name;};NI_tmp为指向struct if_nameindex的指针那么NI_tmp下一个接口的表示方法NI_tmp (struct if_nameindex *)((CHAR *)NI_tmp sizeof(struct if_nameindex)DEV_NAME_LENGTH)为什么要加DEV_NAME_LENGTH设备名最大长度解答sizeof(struct if_nameindex)计算的是结构体在内存中占用的字节数它不包括if_name指针所指向的字符串大小NI_tmp偏移到下一个接口时要偏移过if_name结构体大小的量即DEV_NAME_LENGTHsizeof(struct if_nameindex) INT32即int占4字节char是 1 字节指针的大小通常是 4 或 8 字节具体取决于系统是 32 位4字节还是 64 位(8字节)所以结构体总体大小32位系统44 864位系统48 122、定义结构体变量指针并分配内存用于存储通过IOCtl获取到的网络字段信息struct networkinfo{struct ifaddrs iastruct sockaddr addrnetmask,broadaddr,dstaddr;char name[IF_NAMESIZE];}*storage;storage (struct networkinfo*)malloc(2*num* sizeog storage[0]);if(storage NULL){MOS_IF_FreeNameIndex(NI);free(storage);return -1;}storage各字段赋值....ifap赋值*ifap storage[0].ia这里在32位架构上出现core dump问题排查后发现解引用空指针导致的解引用空指针尝试访问一个空NULL或nullptr指针的内存地址这通常会导致程序立即 崩溃。调用:struct ifaddrs **ifap NULL; getifaddrs(ifap);实现int getifaddrs(struct ifaddrs **ifap){*ifap storage[0].ia;} 执行*ifap storage[0].ia;时core dump原因解引用空指针导致。修改调用:struct ifaddrs *ifa NULLstruct ifaddrs **ifap ifa;getifaddrs(ifap);
为自研操作系统封装getifaddrs函数
一、参考glic中对应函数的实现glibc源码地址https//ftp.gnu.org/gnu/glibc我下载了2.31版本参考ifaddrs.c ifaddrs.h文件中代码实现。二、代码实现1、新增/source/os/include/services/posix/sys/ifaddrs.hstruct ifaddrs{struct ifaddrs *ifa_next; /* Next item in list */char *ifa_name; /* Name of interface */unsigned int ifa_flags; /* Flags from SIOCGIFFLAGS */struct sockaddr *ifa_addr; /* Address of interface */struct sockaddr *ifa_netmask; /* Netmask of interface */union{struct sockaddr *ifu_broadaddr; /* Broadcast address of interface */struct sockaddr *ifu_dstaddr; /* Point-to-point destination address */} ifa_ifu;#define ifa_broadaddr ifa_ifu.ifu_broadaddr#define ifa_dstaddr ifa_ifu.ifu_dstaddrvoid *ifa_data; /* Address-specific data */};2、新增/source/os/service/posix/pse53/netdb/pse52_ifaddrs.cINT getaddrs(struct ifaddrs **ifap){}三、问题记录1、struct if_nameindex{INT32 if_index;CHAR *if_name;};NI_tmp为指向struct if_nameindex的指针那么NI_tmp下一个接口的表示方法NI_tmp (struct if_nameindex *)((CHAR *)NI_tmp sizeof(struct if_nameindex)DEV_NAME_LENGTH)为什么要加DEV_NAME_LENGTH设备名最大长度解答sizeof(struct if_nameindex)计算的是结构体在内存中占用的字节数它不包括if_name指针所指向的字符串大小NI_tmp偏移到下一个接口时要偏移过if_name结构体大小的量即DEV_NAME_LENGTHsizeof(struct if_nameindex) INT32即int占4字节char是 1 字节指针的大小通常是 4 或 8 字节具体取决于系统是 32 位4字节还是 64 位(8字节)所以结构体总体大小32位系统44 864位系统48 122、定义结构体变量指针并分配内存用于存储通过IOCtl获取到的网络字段信息struct networkinfo{struct ifaddrs iastruct sockaddr addrnetmask,broadaddr,dstaddr;char name[IF_NAMESIZE];}*storage;storage (struct networkinfo*)malloc(2*num* sizeog storage[0]);if(storage NULL){MOS_IF_FreeNameIndex(NI);free(storage);return -1;}storage各字段赋值....ifap赋值*ifap storage[0].ia这里在32位架构上出现core dump问题排查后发现解引用空指针导致的解引用空指针尝试访问一个空NULL或nullptr指针的内存地址这通常会导致程序立即 崩溃。调用:struct ifaddrs **ifap NULL; getifaddrs(ifap);实现int getifaddrs(struct ifaddrs **ifap){*ifap storage[0].ia;} 执行*ifap storage[0].ia;时core dump原因解引用空指针导致。修改调用:struct ifaddrs *ifa NULLstruct ifaddrs **ifap ifa;getifaddrs(ifap);