4

我看到TUNSETIFFioctl 的定义相互矛盾。如果我查看linux/if_tun.h我的系统,我会看到这一行:

#define TUNSETIFF     _IOW('T', 202, int)

这表明 TUNSETIFF ioctl 采用指向int. 此外,如果我打印出 的值TUNSETIFF,我会得到 1074025674,如果我屏蔽掉大小位,则表明这个 ioctl 获取大小为 4 字节的数据。

但是当我查看周围的文档时TUNSETIFF,我看到了将指针传递给struct ifreq. 例如在官方文档中:

#include <linux/if.h>
#include <linux/if_tun.h>

int tun_alloc(char *dev)
{
    struct ifreq ifr;
    int fd, err;

    if( (fd = open("/dev/net/tun", O_RDWR)) < 0 )
       return tun_alloc_old(dev);

    memset(&ifr, 0, sizeof(ifr));

    /* Flags: IFF_TUN   - TUN device (no Ethernet headers) 
     *        IFF_TAP   - TAP device  
     *
     *        IFF_NO_PI - Do not provide packet information  
     */ 
    ifr.ifr_flags = IFF_TUN; 
    if( *dev )
       strncpy(ifr.ifr_name, dev, IFNAMSIZ);

    if( (err = ioctl(fd, TUNSETIFF, (void *) &ifr)) < 0 ){
       close(fd);
       return err;
    }
    strcpy(dev, ifr.ifr_name);
    return fd;
}

那么为什么会出现这种差异呢?只是头文件中的错误吗?

4

2 回答 2

1

"if.h"仅包含&时出现相同的错误"if_tun.h"

当我包含<sys/ioctl.h>它时,一切似乎都很好

希望这会有所帮助

于 2017-08-16T07:40:16.777 回答
1

所有 ioctl 都有一个参数,其含义随 ioctl 不同而不同。在此代码的情况下,它是指向用户空间结构的指针。请注意,从内核的角度来看,这只是一个词,而不是指针。用户空间指针仅用于在内核和用户空间之间复制数据,不能直接解引用。

于 2017-08-09T14:46:04.787 回答