当前位置: 技术问答>linux和unix
ioctl函数的参数问题
来源: 互联网 发布时间:2016-10-26
本文导语: 事情背景:用ioctl调用删除arp缓存的命令,格式为ioctl(sd,SIOCDARP,&arpreq); 事情经过:直接调用这个函数的时候,可以成功。但把它放到另一个函数的中调用,却失败。 失败原因:无效的参数 原因分析:第二参数一定...
事情背景:用ioctl调用删除arp缓存的命令,格式为ioctl(sd,SIOCDARP,&arpreq);
事情经过:直接调用这个函数的时候,可以成功。但把它放到另一个函数的中调用,却失败。
失败原因:无效的参数
原因分析:第二参数一定正确,第三参数由第二参数决定,因单独调用可以成功,所有第三参数应该也正确。最有可能出错的是第一个参数。
原因分析2:第一个参数是一个套接字,而主函数中有另一个套接字,调用失败。单独调用则成功。
主函数中套接子:socket(AF_INET,SOCK_RAW,IPPROTO_ICMP).本函数中套接字:socket(AF_INET,SOCK_DGRAM,0);
问题:第一个参数应该怎样设定?
事情经过:直接调用这个函数的时候,可以成功。但把它放到另一个函数的中调用,却失败。
失败原因:无效的参数
原因分析:第二参数一定正确,第三参数由第二参数决定,因单独调用可以成功,所有第三参数应该也正确。最有可能出错的是第一个参数。
原因分析2:第一个参数是一个套接字,而主函数中有另一个套接字,调用失败。单独调用则成功。
主函数中套接子:socket(AF_INET,SOCK_RAW,IPPROTO_ICMP).本函数中套接字:socket(AF_INET,SOCK_DGRAM,0);
问题:第一个参数应该怎样设定?
|
第二第三个参数意思很清楚,第一个参数实在很令人费解
|
你2个套接字不同的啊,第二个是udp,我没用过udp删除
第一个参数就是你使用的对象,socket创建的那个套接字
第一个参数就是你使用的对象,socket创建的那个套接字
|
其实结合内核驱动函数来看就很容易理解了,ioctl不是一个特定的实现一种功能的函数,它内核空间与用户空间的借口函数,所以第一个参数要指定是哪一个设备,如果不指定就不知道你要调用哪个设备的ioctl接口
|
sd,你就用socket()创建出一个文件描述符,不就好了吗?临时创建一下就行了,只给ioctl()用一下。