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