TUNSETIFF ioctl类型的混淆

TUNSETIFF ioctl类型的混淆,c,linux,ioctl,tun,C,Linux,Ioctl,Tun,我看到对TUNSETIFFioctl的定义存在冲突。如果我在我的系统上查看linux/If_tun.h,我会看到这一行: #define TUNSETIFF _IOW('T', 202, int) 这表示TUNSETIFF ioctl获取指向int的指针。此外,如果我打印出TUNSETIFF的值,我会得到1074025674,如果我屏蔽大小位,则表明此ioctl获取大小为4字节的数据 但是当我查看TUNSETIFF周围的文档时,我看到了将指针传递到struct ifreq的实例。例如:

我看到对
TUNSETIFF
ioctl的定义存在冲突。如果我在我的系统上查看
linux/If_tun.h
,我会看到这一行:

#define TUNSETIFF     _IOW('T', 202, int)
这表示TUNSETIFF ioctl获取指向
int
的指针。此外,如果我打印出
TUNSETIFF
的值,我会得到1074025674,如果我屏蔽大小位,则表明此ioctl获取大小为4字节的数据

但是当我查看
TUNSETIFF
周围的文档时,我看到了将指针传递到
struct ifreq
的实例。例如:

#包括
#包括
int tun_alloc(字符*开发)
{
结构ifreq-ifr;
int-fd,err;
如果((fd=open(“/dev/net/tun”,O_RDWR))<0)
返回tun_alloc_old(开发);
memset(&ifr,0,sizeof(ifr));
/*标志:IFF_TUN-TUN设备(无以太网报头)
*IFF_抽头-抽头装置
*
*IFF_NO_PI-不提供数据包信息
*/ 
ifr.ifr_flags=IFF_TUN;
如果(*dev)
strncpy(ifr.ifr_名称、开发、IFNAMSIZ);
如果((err=ioctl(fd,TUNSETIFF,(void*)和ifr))<0){
关闭(fd);
返回错误;
}
strcpy(dev,ifr.ifr\u name);
返回fd;
}

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

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

我在仅包含
“if.h”
“if\tun.h”

当我加入
时,一切都正常


希望这会有所帮助

您是如何打印
TUNSETIFF
的值的?
#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;
}