(一) 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
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

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


被折叠的 条评论
为什么被折叠?



