Linux 应用开发常用函数速查手册一、设备操作基本函数最常用所有 Linux 设备访问都遵循一个套路open → read/write → ioctl → close1. open()intopen(constchar*pathname,intflags);作用打开设备 / 文件。例子intfdopen(/dev/led,O_RDWR);返回成功 → 文件描述符fd失败 →-1驱动对应file_operations .open2. read()ssize_tread(intfd,void*buf,size_tcount);作用从设备读取数据。例子charbuf[10];read(fd,buf,sizeof(buf));驱动对应file_operations .read3. write()ssize_twrite(intfd,constvoid*buf,size_tcount);作用向设备写数据。例子write(fd,1,1);驱动对应file_operations .write4. ioctl()intioctl(intfd,unsignedlongcmd,unsignedlongarg);作用发送控制命令。例子ioctl(fd,LED_ON);驱动对应file_operations .unlocked_ioctl5. close()intclose(intfd);作用关闭设备。例子close(fd);驱动对应file_operations .release二、I/O 多路复用函数重点当你看到应用程序使用select()、poll()或epoll()其实就是等待多个设备同时有数据。比如键盘socket触摸屏管道1. select()最早的多路复用函数。intselect(intnfds,fd_set*readfds,fd_set*writefds,fd_set*exceptfds,structtimeval*timeout);例子fd_set rfds;FD_ZERO(rfds);FD_SET(fd,rfds);select(fd1,rfds,NULL,NULL,NULL);if(FD_ISSET(fd,rfds)){read(fd,buf,sizeof(buf));}特点最老最大 1024 fd效率低2. poll()比 select 更现代。intpoll(structpollfd*fds,nfds_tnfds,inttimeout);例子structpollfdfds;fds.fdfd;fds.eventsPOLLIN;poll(fds,1,-1);if(fds.reventsPOLLIN){read(fd,buf,sizeof(buf));}特点没有 1024 限制内核遍历3. epoll()Linux 最强 I/O 模型。epoll_create()epoll_ctl()epoll_wait()例子intepfdepoll_create(1);structepoll_eventev;ev.eventsEPOLLIN;ev.data.fdfd;epoll_ctl(epfd,EPOLL_CTL_ADD,fd,ev);epoll_wait(epfd,events,10,-1);特点高并发服务器nginx / redis 使用三、三者对比面试常问函数最大连接效率使用场景select1024低简单程序poll无限制中普通程序epoll无限制高服务器一句话记忆select → 老 poll → 改进 epoll → 高并发四、驱动里对应函数非常关键当应用调用这些函数时驱动会进入应用函数驱动函数open.openread.readwrite.writeioctl.unlocked_ioctlpoll/select.pollclose.release例如structfile_operationsmy_fops{.openmy_open,.readmy_read,.writemy_write,.pollmy_poll,};五、阻塞 vs 非阻塞 IO很多驱动教程都会写阻塞IO 非阻塞IO例子阻塞read(fd,buf,10);如果没有数据程序卡住等待非阻塞open(/dev/test,O_NONBLOCK);如果没数据立即返回六、驱动里如何支持 select/poll驱动要实现.poll例子unsignedintmy_poll(structfile*file,poll_table*wait){poll_wait(file,wait_queue,wait);if(data_ready)returnPOLLIN;return0;}作用告诉内核设备有没有数据七、给你一个最简单完整程序#includestdio.h#includefcntl.h#includeunistd.hintmain(){intfd;charbuf[10];fdopen(/dev/test,O_RDWR);read(fd,buf,sizeof(buf));write(fd,1,1);close(fd);return0;}流程open → read → write → close八、真正的高手学习方法非常重要不要死记函数而是记套路Linux 应用基本只有 5 件事open read write ioctl poll90%程序都是打开设备 等待数据 读取数据 处理数据