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);
}

関連ページ