C言語システムコール-ioctl
ioctlシステムコール
概要
ioctlはデバイスを制御します。
ioctlによって制御できるデバイスは多数あります。
引数に指定するファイルディスクリプタやioctlリクエスト番号は、各プラットフォームによって様々です。
詳細は各プラットフォーム向けのmanコマンドやマニュアルを参照下さい。
・https://www.ibm.com/docs/ja/zos/2.5.0?topic=functions-ioctl-control-device)
・https://pubs.opengroup.org/onlinepubs/009604599/functions/ioctl.html
サンプルプログラム
ここでは、ネットワークインターフェースに割り当てられたIPアドレスを表示します。
「./cmd eth0」を実行するとeth0のIPアドレスが表示されます。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <net/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>
/*!
* @brief IPアドレスを表示する。
* @param[in] netif ネットワークインターフェース
* @return 0:success/-1:failure
*/
static int
show_ipaddr(char *netif)
{
int rc = 0;
int sd = 0;
struct ifreq ifr;
sd = socket(PF_INET, SOCK_DGRAM, 0);
if(sd < 0){
printf("Error: socket() %s\n", strerror(errno));
return(-1);
}
ifr.ifr_addr.sa_family = AF_INET;
strncpy(ifr.ifr_name, netif, IFNAMSIZ-1);
rc = ioctl(sd, SIOCGIFADDR, &ifr);
if(rc < 0){
printf("Error: ioctl() %s\n", strerror(errno));
close(sd);
return(-1);
}
printf("%s\n",
inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
close(sd);
return(0);
}
int
main(int argc, char *argv[])
{
int rc = 0;
if(argc != 2){
fprintf(stderr, "Usage: %s <network-interface>\n", argv[0]);
exit(EXIT_FAILURE);
}
rc = show_ipaddr(argv[1]);
if(rc != 0) exit(EXIT_FAILURE);
exit(EXIT_SUCCESS);
}