本文转载自:http://blog.csdn.net/fansongy/article/details/6853395 一、文件锁 文件锁用于多个用户共同使用或操作同一个文件。有读锁的时候可以再加读锁,不能再加写锁。有写锁的时候,不能加任何锁,加读锁时,该描述符必须是读打开,加写锁时,该描述符必须是写打开,且只在进程间有用。 重写的上锁方法 [cpp] view plain copy print? //lock.c int lock_set(int fd,int type){ struct flock lock; lock.l_type=type; lock.l_start=0; lock.l_whence=SEEK_SET; lock.l_len = 0; lock.l_pid=-1; fcntl(fd,F_GETLK,&lock); if(lock.l_type!=F_UNLCK){ if(lock.l_type == F_RDLCK) printf("Read lock already set by %d!\n",lock.l_pid); else if(lock.l_type == F_WRLCK) printf("Write lock already set by %d!\n",lock.l_pid); } lock.l_type = type; //此处的F_SETLKW为F_SETLK的阻塞版本,当无法获取锁时进入睡眠等待状态 if(fcntl(fd,F_SETLKW,&lock)<0){ printf("Lock failed:type=%d!\n",lock.l_type); exit(1); } switch(lock.l_type){ case F_RDLCK: printf("read lock set by %d\n",getpid()); break; case F_WRLCK: printf("write lock set by %d\n",getpid()); break; case F_UNLCK: printf("UN lock set by %d\n",getpid()); break; default: break; } } 上写锁 [cpp] view plain copy print? #include #include #include #include"lock.c" int main(){ int fd; fd=open("readme",O_RDWR|O_CREAT,0666); if(fd<0){ printf("Open file error\n"); exit(1); } lock_set(fd,F_WRLCK); getchar(); lock_set(fd,F_UNLCK); getchar(); return 0; } 上读锁 [cpp] view plain copy print? #include #include #include #include"lock.c" int main(){ int fd; fd=open("readme",O_RDWR|O_CREAT,0666); if(fd<0){ printf("Open file error\n"); exit(1); } lock_set(fd,F_RDLCK); getchar(); lock_set(fd,F_UNLCK); getchar(); return 0; } 在两个终端中测试: 两个终端可以同时加上读锁。 有一个终端加上读锁,则必须等读锁释放才能加写锁。 有一个终端加写锁必须释放才能加别的锁。 二、多路复用:select、poll [cpp] view plain copy print? #include #include #include #include #define MAX(a,b) (a>b?a:b) int main(){ int fd[3]; char buff[1024]; int res,max_fd,i,num; fd_set insert,temp_insert; struct timeval tv; fd[0]=0; if((fd[1]=open("in1",O_RDONLY|O_NONBLOCK))<0){ printf("open in1 error!\n"); return 1; } if((fd[2]=open("in2",O_RDONLY|O_NONBLOCK))<0){ printf("open in2 error!\n"); return 1; } //选出最大的fd,select()函数用的 max_fd=MAX(MAX(fd[0],fd[1]),fd[2]); //清空fd_set FD_ZERO(&insert); for(i=0;i<3;i++){ FD_SET(fd[i],&insert); } //设置延迟 tv.tv_sec=60; tv.tv_usec=0; while(FD_ISSET(fd[0],&insert) || FD_ISSET(fd[1],&insert) || FD_ISSET(fd[2],&insert)){ temp_insert = insert; //select函数会对fd_set产生修改,只保存变化的文件符,所以要用一个temp res=select(max_fd+1,&temp_insert,NULL,NULL,&tv); switch(res){ case -1: printf("select error!\n"); return 1; break; case 0: printf("time out\n"); return 1; break; default: for(i=0;i<3;i++){ if(FD_ISSET(fd[i],&temp_insert)){ memset(buff,0,1024); num=read(fd[i],buff,1024); if(num<0){ return 1; }else if(num == 0){ close(fd[i]); FD_CLR(fd[i],&insert); }else{ if(i == 0){ if((buff[0] == 'q') || (buff[0] == 'Q')){ return 0; } } write(STDOUT_FILENO,buff,num); } } } } } } poll用法与select很相似,只是在一些变量上有些不同: [cpp] view plain copy print? #include #include #include #include #include #include #include #define MAX_BUFFER_SIZE 1024 #define IO_IN_FILES 3 #define TIME_DELAY 60000 int main() { struct pollfd fds[IO_IN_FILES]; char buff[MAX_BUFFER_SIZE]; int i,res,real_read; fds[0].fd=0; if((fds[1].fd=open("in1",O_RDONLY|O_NONBLOCK))<0) { printf("Open in1 error!\n"); return 1; } if((fds[2].fd=open("in2",O_RDONLY|O_NONBLOCK))<0) { printf("Open in2 error!\n"); return 1; } for(i=0;i

linux文件读写 文件锁、select、poll【转】相关推荐

  1. Linux文件读写改权限详解

    Linux文件读写改权限详解 文件的rwx权限 [ r ] [ w ] [ x ] 该文件可读(read) 该文件可修改(write) 该文件可执行(execute) 注意:只有当该文件所在目录有写权 ...

  2. Linux文件读写机制及优化方式

    本文只讨论Linux下文件的读写机制,不涉及不同读取方式如read,fread,cin等的对比,这些读取方式本质上都是调用系统api read,只是做了不同封装.以下所有测试均使用open, read ...

  3. linux 文件缓存大小设置,Linux文件读写机制及优化方式

    导读 Linux是一个可控性强的,安全高效的操作系统.本文只讨论Linux下文件的读写机制,不涉及不同读取方式如read,fread,cin等的对比,这些读取方式本质上都是调用系统api read,只 ...

  4. linux文件读写 c语言,Linux 下 C语言大文件读写(大于4G)

    以下的做法整理自论坛上的帖子. 如何create大文件 要大就非常大,1T吧. 有两种方法: 一.dd dd if=/dev/zero of=1T.img bs=1G seek=1024 count= ...

  5. linux文件读写实例,[Linux文件]使用read函数从文件读取数据的实例

    //这是一个使用read函数把目标文件中数据读出写入到另外一个文件中的实例 //待读出数据文件由argv1参数给,待写入数据文件由argv2给出 #include #include #include ...

  6. Linux select/poll机制原理分析

    转载一篇文章,讲解select和poll机制的,分享给大家. 前言 Read the fucking source code!  --By 鲁迅 A picture is worth a thousa ...

  7. epoll编程实例客户端_深入底层探析网络编程之多路复用器(select,poll,epoll)

    IO模型 只关注IO,不关注IO读写完成后的事情. 同步:程序(APP)自己进行读/写操作 异步:由Kernel完成读/写,程序跑起来感觉像没有访问IO,访问的是buffer 阻塞:BLOCKING, ...

  8. Linux 高并发学习笔记 - Linux 文件操作函数

    1.6.2 Linux 文件操作函数 Linux 高并发学习笔记 - 笔记索引 前言 关于文件操作函数这一块主要用英文文档的形势书写,因为凉皮在写文档的时候发现Markdown用起来太繁琐了.那么关于 ...

  9. linux网络编程--select/poll/epoll 详解

    目录 参考链接 epoll函数 close epoll event EL/LT ET Edge Trigger 边沿触发工作模式 LT Level Trigger 水平触发工作模式 epoll 源码解 ...

最新文章

  1. Moodle: 登记学生,检测学生是否存在在课程 Check if user is enrolled or enroll a user in course...
  2. 使用IAR在线调试功能显示数据变化曲线
  3. MyBatis--动态插入多条数据
  4. Java SE 9:不可变Map和Map.Entry的工厂方法
  5. 重构之以委托取代继承
  6. 在 Mac 上打开照片应用时遇到错误 4302,如何修复?
  7. 对文件、字符串和byte数组进行MD5加密
  8. 使用cmd命令创建vue(ivieiw)项目
  9. C调用Python2.7,与调用Python3.5相差很大
  10. Java旅游管理系统本科生毕业设计任务书
  11. typedef用法和结构体指针用法
  12. netperf-2.7.0 交叉编译
  13. 计算机考试怎么复制粘贴文件,复制粘贴,教您电脑复制粘贴不能用了怎么解决...
  14. 计算机机房线槽,机房机柜布置 机房整改之布线篇~
  15. mysql触发器不起作用_mysql – 授予模式触发器不起作用
  16. 课堂内外杂志课堂内外杂志社课堂内外编辑部2022年第9期目录
  17. 靶机渗透练习93-hacksudo:1.0.1
  18. Erp 公司系列:QAD
  19. 蓝桥杯评分标准_2015-第六届蓝桥杯大赛个人赛省赛(软件类)真题 C大学B组
  20. 访问一个网页的全过程(根据7层协议分析)

热门文章

  1. 【Android】自定义Loader:loadInBackground+onStartLoading+onStopLoading+onReset+onCanceled
  2. Widget(桌面插件)
  3. Eclipse+Maven配置
  4. Android 单击+双击+短按+长按 逻辑
  5. C++实现直接插入排序
  6. 将tensorflow训练好的模型移植到Android (MNIST手写数字识别)
  7. 性能瓶颈分析整体思路
  8. 【牛客网多校】19-7-25-H题 Magic Line
  9. php 基础 判断类型
  10. php 浮点型float 强转int php金额计算 php元转分