Chinaunix首页 | 论坛 | 博客
  • 博客访问: 91347
  • 博文数量: 19
  • 博客积分: 66
  • 博客等级: 民兵
  • 技术积分: 120
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-25 19:14
文章分类
文章存档

2012年(19)

分类:

2012-01-15 22:49:46

原文地址:ioctl操作 作者:ubuntuer

传统上ioctl函数是用于那些普遍使用,但不适合归入其他类别的任何特性的系统接口。Posix去掉了ioctl,它通过
创建特殊的其功能已被Posix标准化的包裹函数来代替ioctl。这一章介绍和网络编程有关的ioctl操作。
 
1. ioctl函数
 
int ioctl(int d, int request, ...);
 
和网络有关的ioctl请求有6类:
套接口操作
文件操作
接口操作
ARP高速缓存操作
路由表操作
流系统
 
2. 套接口操作
 
类别 请求 描述 数据类型
套接口 SIOCATMASK 在带外标志上吗 int
  SIOCSPGRP 设置套接口的进程ID和进程组ID int
  SIOCGPGPR 获取套接口的进程ID和进程组ID int
 
SIOCATMASK: 如果套接口的读指针在带外标志上,则通过第三个参数指向的整数返回一个非零值,否则返回零。
 
3. 文件操作
 
类别 请求 描述 数据类型
文件操作 FIONBIO 设置/清除非阻塞标志 int
FIOASYNC 设置/清除异步I/O标志 int
FIONREAD 获取接收缓冲区中数据的字节数 int
FIOSETOWN 设置文件的进程ID或进程组ID int
FIOGETOWN 获取文件的进程ID或进程组ID int
 
FIONBIO: 这个请求和用fcntl的F_SETFL命令设置和清除O_NONBLOCK标志效果相同。
 
4. 接口配置
类别 请求 描述 数据类型
接口 SIOCGIFCONF 获取所有接口的列表 struct ifconf
SIOCSIFADDR 设置接口地址 struct ifreq
SIOCGIFADDR 获取接口地址 struct ifreq
SIOCSIFFLAGS 设置接口标志 struct ifreq
SIOCGIFFLAGS 获取接口标志 struct ifreq
SIOCSIFDSTADDR 设置点对点地址 struct ifreq
SIOCGIFDSTADDR 获取点对点地址 struct ifreq
SIOCGIFBRDADDR 获取广播地址 struct ifreq
SIOCSIFBRDADDR 设置广播地址 struct ifreq
SIOCGIFNETMASK 获取子网掩码 struct ifreq
SIOCSIFNETMASK 设置子网掩码 struct ifreq
SIOCGIFMETRIC 获取接口的测度(metric) struct ifreq
SIOCSIFMETRIC 设置接口的测度(metric) struct ifreq
SIOCxxx
 
 
 
5. ARP
 
类别 请求 描述 数据类型
ARP SIOCSARP 创建/修改ARP项 struct arpreq
SIOCGARP 获取ARP项 struct arpreq
SIOCDARP 删除ARP项 struct arpreq
 
 
6. 路由
 
类别 请求 描述 数据类型
路由 SIOCADDRT 增加路径 struct rtentry
SIOCDELRT 删除路径 struct rtentry
 

FIFO做为一种有名管道的形式,在unix下编程经常会用到,在AIX和Solaris上用ls -l能像查看普通文件一样,很方便的看到当前FIFO里面还剩余多少字节未被读取,但是linux下却不行。通过调用ioctl可以实现这个功能:

C代码
  1. #include   
  2. #include   
  3. #include   
  4. #include   
  5. #include   
  6. #include   
  7. #include   
  8. #include   
  9.   
  10. int main()   
  11. {   
  12.     int fd = open("test.q", O_RDWR);   
  13.     if (fd<0)   
  14.      {   
  15.          perror("open fifo:");   
  16.         return -1;   
  17.      }   
  18.        
  19.     int n;   
  20.     int ret;   
  21.     while(1){      
  22.          ret = ioctl(fd, FIONREAD, &n);     
  23.          printf("%d %d\n", ret, n);   
  24.          sleep(5);   
  25.      }   
  26. }  

上面是一个实例代码,主要功能是

C代码
  1. ret = ioctl(fd, FIONREAD, &n);    

通过使用上述程序,你可以使用下面这个命令往test.q这个FIFO里面写数据,上面的程序会打印出test.q里面剩下的字节数

阅读(1185) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~