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