一、获取本机所有可用网卡名
背景与原理:
在Linux系统中,/proc
目录是一个位于内存中的伪文件系统。
这个目录是内核提供给用户的一个查询中心,通过查询该目录下的文件内容,可以获取到有关系统硬件及当前运行进程的信息,比如CPU信息、负载信息、系统内存信息、磁盘IO信息等。
其中,文件/proc/net/dev
是内核维护的,所有可用的网口都会同步到该文件中。
/proc/net/dev
peng@ubuntu:~$ cat /proc/net/dev
Inter-| Receive | Transmit
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
lo: 26163 292 0 0 0 0 0 0 26163 292 0 0 0 0 0 0
eth0: 285444708 243273 0 0 0 0 0 0 91828270 88660 0 0 0 0 0 0
所以我们要列举出所有可用的网口名称,可以通过查看改文件来实现,
代码原理讲解
-
list_interface_valid()
该函数用于列举所有可用的网口
-
interface_name_cut (char *buf, char **name) 该函数用于将从文件 /proc/net/dev
中国读取的每一行字符串信息,提取出网口名信息,如lo、eth0
代码实现原理如下:
-
函数strrchr()
该函数返回一个指针,指向字符串s中最后一个出现的字符c位置。
二、核心代码如下:
#define IP_SIZE 128
#define PROCBUFSIZ 1024
#define _PATH_PROC_NET_DEV "/proc/net/dev"
static char * interface_name_cut (char *buf, char **name)
{
char *stat;
/* Skip white space. Line will include header spaces. */
while (*buf == ' ')
buf++;
*name = buf;
/* Cut interface name. */
stat = strrchr (buf, ':');
*stat++ = '\0';
return stat;
}
int list_interface_valid()
{
FILE *fp;
char buf[PROCBUFSIZ];
struct interface *ifp;
char *name;
char *p;
/* Open /proc/net/dev. */
fp = fopen (_PATH_PROC_NET_DEV, "r");
if (fp == NULL)
{
printf("open proc file error\n");
return -1;
}
/* Drop header lines. */
fgets (buf, PROCBUFSIZ, fp);
fgets (buf, PROCBUFSIZ, fp);
/* Only allocate interface structure. Other jobs will be done in
if_ioctl.c. */
while (fgets (buf, PROCBUFSIZ, fp) != NULL)
{
p = interface_name_cut (buf, &name);
printf("port=%s\n",name);
}
fclose(fp);
return 0;
}
运行截图
以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !