Linux下select的使用小记
今天使用select编程,问题很多,以前真的没有仔细研究过。
出现了以下几个问题
1 recvfrom在接收时,提供给系统调用的最后一个参数,客户端的地址结构,其长度必须进行初始化,如果为0,则不能接收数据。
2 select的第一个参数为所有监视的文件描述符的最大值+1,而不是监视的文件描述符个数+1。
3 不要监视那些经常可用的文件描述符,如果这样做,select会一直返回。
4 在select返回后,如果监视的文件描述符没有状态改变,则在fd_set中此文件描述符会被清0,因此在select的循环中,每次进入都要重新设置我们所关注的文件描述符。
5 如果select使用了超时操作,每次返回select都会修改计时器,将计时器设为余下的时间,因此如果使用了计时器,每次进入循环都要重置计时器。pselect没有这个毛病。
下面是linux下的基于select的一个UDP反射服务器的示例代码:
#include <sys/select.h>
#include <sys/types.h>
#include <sys/time.h>
#include <unistd.h>
#include <stdio.h>
#include <error.h>
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <assert.h>
int
main()
{
int sockfd = socket(AF_INET,SOCK_DGRAM,0);
assert(sockfd>0);
struct sockaddr_in local;
local.sin_family = AF_INET;
local.sin_port = htons(8000);
local.sin_addr.s_addr = INADDR_ANY;
int err = bind(sockfd,(struct sockaddr*)&local,sizeof(local));
assert(err==0);
fd_set sets[3];
for(int i=0;i<3;i++)
{
FD_ZERO(&sets[i]);
}
timeval tv;
char buf[1024];
while(1)
{
FD_SET(sockfd,&sets[0]);
//register
tv.tv_sec = 1;
//monitor and handle
int nfds = select(sockfd+1,&sets[0],&sets[1],&sets[2],&tv);
if(nfds<0)
{
perror("select");
exit(-1);
}
printf("evnet num = %d\n",nfds);
//handle
for(int i=0;i<nfds;i++)
{
struct sockaddr_in remo
相关文档:
2009 年 4 月 23 日
本文中我们针对 Linux 上多线程编程的主要特性总结出 5 条经验,用以改善 Linux 多线程编程的习惯和避免其中的开发陷阱。在本文中,我们穿插一些 Windows 的编程用例用以对比 Linux 特性,以加深读者印象。
背景
Linux 平台上的多线程程序开发相对应其他平台(比如 Windows)的多线程 API 有一些细微 ......
linux的网卡IP地址是存放在文档中的,这个配置文档在/etc/sysconfig/network-scripts下,名称分别为ifcfg-eth0,ifcfg-eth1....假如您有一块网卡,就只有ifcfg-eth0一个文档,假如您有两块或两块以上的网卡,就会有ifcfg-eth1、ifcfg-eth2等文档的出现。
文档结构:
DEVICE=eth0 &n ......
general setup
---> enable deprecated sysfs features which may confuse old
userspace tools
insmod: error inserting '/lib/dm-region-hash.ko' : -1 File exists
解决
cp /boot/initrd-2.6.x.img /tmp
cd /tmp
mkdir newinitrd
cd newinitrd/
zcat ../initrd-2.6.x.img |cpio -i
下 ......
Socket 就是套接字。
Socket 可以和本地目录绑定,也可以和一个IP地址绑定。
int socketpair(sa_family, socket_type, protocal, int sz[2]);
sa_family: AF_LOCAL( 和 AF_UNIX一样) 表示本地的socket 连接
A ......
硬件平台
S3C2410X是三星公司的基于ARM920T的S3C2410X芯片。S3C2410X集成了一个LCD控制器(支持STN和TFT带有触摸屏的液晶显示屏)、SDRAM、触摸屏、USB、SPI、SD和MMC等控制器,4个具有PWM功能的计时器和1个内部时钟,8通道的10位ADC,117位通用I/O口和24位外部中断源,8通道10位AD控制器,处理器工作频率最高达到203MH ......