struct ifreq看起来像这样:
struct ifreq {
char ifr_name[IFNAMSIZ];/* Interface name */
union {
struct sockaddrifr_addr;
struct sockaddrifr_dstaddr;
struct sockaddrifr_broadaddr;
struct sockaddrifr_netmask;
struct sockaddrifr_hwaddr;
short ifr_flags;
int ifr_ifindex;
int ifr_metric;
int ifr_mtu;
struct ifmapifr_map;
char ifr_slave[IFNAMSIZ];
char ifr_newname[IFNAMSIZ];
char * ifr_data;
};
};
如果您正在实施现有的ioctl命令,则必须找出您应该使用的联合中的哪些成员,无论是在用户空间还是内核中。
如果您正在实施自己的ioctl命令,则可以使用ifr_data
。主叫方(用户空间)设置为指向一个本地缓冲区,你会填用copy_to_user()在内核中的成员(即ifr_data是到,你要寻找的。)
即用户空间确实
char buf[128];
struct ifreq req;
strcpy(req.ifr_name,"eth0");
req.ifr_data = buf;
ioctl(fd, SIOCMYIOCTL, &ifr);
这里的缓冲区只是一个固定大小的数组,如果你需要,你可以ofcourse使用结构更灵活,只要用户空间和内核的ioctl()同意什么ifr_data
是。
struct my_ioctl_data {
int a, b, c;
};
struct my_ioctl_data data;
struct ifreq req;
strcpy(req.ifr_name,"eth0");
req.ifr_data = (char*)&data;
ioctl(fd, SIOCMYIOCTL, &ifr);
来源
2014-09-03 11:09:11
nos
非常感谢,它的作品! – 2014-09-03 12:55:01