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