ioctl

ioctlは、デバイスを制御するのに使う。

Man page of IOCTL

今回は、ネットワークデバイスであるNICからIPを取得する。

ioctl.cで、

インターフェース名を入力。
ioctlでSIOCGIFADDRを送る。
成功するとstruct ifreq型のsifrに情報が格納される。

$ ifconfig
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.2.15  netmask 255.255.255.0  broadcast 10.0.2.255
        inet6 fe80::3b07:5151:e763:f8b0  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:75:6b:bc  txqueuelen 1000  (Ethernet)
        RX packets 60323  bytes 13211145 (12.5 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 60397  bytes 8129752 (7.7 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 20  bytes 1720 (1.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 20  bytes 1720 (1.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

$ vi ioctl.c 
$ gcc ioctl.c -o ioctl
$ ./ioctl 
interface_name: enp0s3
enp0s3 ip address = 10.0.2.15
$

IPが出力された。

Sample/unixsyscall/ioctl/ioctl/src/ioctl at master · bg1bgst333/Sample · GitHub