文件锁

多用户多任务操作系统中非常重要的一个内容就是文件锁。用户在更新文件时,期望可以使用某种机制,防止两种进程同时更新文件同一区域而造成丢失,或者防止文件内容在未更新完毕时被读取等并发引起的问题,这种机制就是文件锁。
     进程在操作文件期间,可以使用文件锁,锁定文件中的敏感部分,防止其他进程越权操作该部分数据。函数fcntl提供了对文件任意区域置锁的能力,既可以锁住全部文件,又可以锁住文件的部分记录,故文件锁又成为"记录锁".
     根据文件锁的访问方式,可以区分读锁和写锁两种。读锁又名共享锁,它用来防止进程读取的文件记录被更改。文件记录可以同时设置多个读锁,但当有一个读锁存在时,就不能在该记录出设置写锁。
     写锁又名互斥锁,它用来保证文件更改记录时不被干扰,确保文件一致性和完整性,防止写丢失或读"脏"数据。文件记录一旦设置了写锁,就不能再设置任意锁,除非写锁接触。
    文件记录在同一时刻,可以设置多个读锁,单仅能设置一个写锁,并且读、写不能不能同时存在。


linux用文件锁实现保证一个程序只能启动一个进程

http://www.cppblog.com/Tim/archive/2011/10/27/159201.html

[cpp]  view plain  copy
  1. #include   
  2. #include   
  3. #include   
  4. #include   
  5.   
  6. int main(int argc,char* argv[])  
  7. {  
  8.  int fd;  
  9.  int lock_result;  
  10.  struct flock lock;  
  11.  char * pFileName = "tmp.lck";  
  12.  fd = open(pFileName,O_RDWR);  
  13.  if(fd<0)  
  14.  {  
  15.   printf("Open file failed.\n");  
  16.   return 1;  
  17.  }  
  18.  lock_result = lockf(fd,F_TEST,0);  //参数使用F_LOCK,则如果已经加锁,则阻塞到前一个进程释放锁为止,参数0表示对整个文件加锁  
  19.  //返回0表示未加锁或者被当前进程加锁;返回-1表示被其他进程加锁  
  20.  if(lock_result<0)  
  21.  {  
  22.   perror("Exec lockf function failed.\n");  
  23.   return 1;  
  24.  }  
  25.    
  26.   lock_result = lockf(fd,F_LOCK,0);  //参数使用F_LOCK,则如果已经加锁,则阻塞到前一个进程释放锁为止,参数0表示对整个文件加锁  
  27.  if(lock_result<0)  
  28.  {  
  29.   perror("Exec lockf function failed.\n");  
  30.   return 1;  
  31.  }  
  32.   
  33.  printf("Pid: %ld process locked the file.\n",(long)getpid());  
  34.    
  35.  //do something  
  36.  while(getchar()<0);  
  37.    
  38.  printf("Pid: %ld process release the file.\n",(long)getpid());  
  39.  return 0;  
  40. }   

你可能感兴趣的:(linux)