基于套接字描述符的ioctl( )系统调用详解

本文详细介绍了套接字描述符上ioctl( )系统调用的实现,包括如何处理不同类型的命令,如FIONBIO、FIOASYNC等,并探讨了ioctl命令的层次关系,涉及ifnet{}, ifaddr{}结构,以及底层硬件设备的交互。重点关注了SIOCCGIFCONF、SIOCSIFADDR等关键命令的处理过程。" 129567321,8519086,SVG Path绘制圆弧技巧:调整起点与方向,"['SVG', '前端开发', 'HTML', 'JavaScript']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(一) ioctl( )系统调用的实现
ioctl( )
系统调用提供了一个通用命令接口,原型为 int ioctl(int fd, unsigned long com, caddr_t data) 。其中fd是一个设备描述符或者是一个网络连接(即套接字描述sockfd)。本文针对的是套接字描述符. 首先用户进程通过socket(AF_xxx, SOCK_xxx, flag)函数创建一个TCP或者UDP套接字sockfd, 然后再调用ioctl( )函数发送io命令.而从src/sys/kern/sockio.c中我们发现基于socket的ioctl( )函数实际上是调用了bsd_ioctl(struct CYG_FILE_TAG *fp, CYG_ADDRWORD cmd, CYG_ADDRWORD data):
// Table entrys

NSTAB_ENTRY( bsd_nste, 0,
             "bsd_tcpip",
             "",
             0,
             bsd_init,
             bsd_socket);

struct cyg_sock_ops bsd_sockops =
{
    bsd_bind,
    bsd_connect,
    bsd_accept,
    bsd_listen,
    bsd_getname,
    bsd_shutdown,
    bsd_getsockopt,
    bsd_setsockopt,
    bsd_sendmsg,
    bsd_recvmsg
};

cyg_fileops bsd_sock_fileops =
{
    bsd_read,
    bsd_write,
    bsd_lseek,
    bsd_ioctl,
    bsd_select,
    bsd_fsync,
    bsd_close,
    bsd_fstat,
    bsd_getinfo,
    bsd_setinfo   
};

下面是bsd_ioctl( )函数的具体实现:
static int
bsd_ioctl(struct CYG_FILE_TAG *fp, CYG_ADDRWORD cmd, CYG_ADDRWORD data)
{
    struct socket *so = (struct socket *)fp->f_data;
    void *p = 0;

    switch (cmd) {

    case FIONBIO:
        if (*(int *)data)
            so->so_state |= SS_NBIO;
  &nb
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值