linux文件读写 文件锁、select、poll【转】
生活随笔
收集整理的這篇文章主要介紹了
linux文件读写 文件锁、select、poll【转】
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
本文轉(zhuǎn)載自:http://blog.csdn.net/fansongy/article/details/6853395 一、文件鎖 文件鎖用于多個用戶共同使用或操作同一個文件。有讀鎖的時候可以再加讀鎖,不能再加寫鎖。有寫鎖的時候,不能加任何鎖,加讀鎖時,該描述符必須是讀打開,加寫鎖時,該描述符必須是寫打開,且只在進(jìn)程間有用。 重寫的上鎖方法 [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的阻塞版本,當(dāng)無法獲取鎖時進(jìn)入睡眠等待狀態(tài) 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; } 在兩個終端中測試: 兩個終端可以同時加上讀鎖。 有一個終端加上讀鎖,則必須等讀鎖釋放才能加寫鎖。 有一個終端加寫鎖必須釋放才能加別的鎖。 二、多路復(fù)用: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()函數(shù)用的 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); } //設(shè)置延遲 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函數(shù)會對fd_set產(chǎn)生修改,只保存變化的文件符,所以要用一個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
總結(jié)
以上是生活随笔為你收集整理的linux文件读写 文件锁、select、poll【转】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 优化混合云性能:数据管理技巧大公开
- 下一篇: Marble原理之线程中断