Linux系统编程之struct flock 结构体

该结构是在lock.h文件中定义。

lock.h File

功能

定义一些文件的锁的选项

Description

The flock structure in the /usr/include/sys/flock.h file, which describes a lock, contains the following fields:

l_type   Describes the type of lock. If the value of theCommandparameter to thefcntlsubroutine isF_SETLKorF_SETLKW, thel_typefield indicates the type of lock to be created. Possible values are: F_RDLCK A read lock is requested. F_WRLCK A write lock is requested. F_UNLCK Unlock. An existing lock is to be removed.  

If the value of theCommandparameter to thefcntlsubroutine isF_GETLK, thel_typefield describes an existing lock. Possible values are:

F_RDLCK A conflicting read lock exists. F_WRLCK A conflicting write lock exists. F_UNLCK No conflicting lock exists.  
 
l_whence   Defines the starting offset. The value of this field indicates the point from which the relative offset, thel_startfield, is measured. Possible values are: SEEK_SET The relative offset is measured from the start of the file. SEEK_CUR The relative offset is measured from the current position. SEEK_END The relative offset is measured from the end of the file.  

These values are defined in theunistd.hfile.

 
l_start   Defines the relative offset in bytes, measured from the starting point in thel_whencefield.  
l_len   Specifies the number of consecutive bytes to be locked.  
l_sysid   Contains the ID of the node that already has a lock placed on the area defined by thefcntlsubroutine. This field is returned only when the value of theCommandparameter isF_GETLK.  
l_pid   Contains the ID of a process that already has a lock placed on the area defined by thefcntlsubroutine. This field is returned only when the value of theCommandparameter isF_GETLK.  

l_vfs

 

Specifies the file system type of the node identified in thel_sysidfield.

 
看一下示例吧!

int   waldirlock(Wal *w)   {       int r;       int fd;       struct flock lk;       char path[PATH_MAX];          r = snprintf(path, PATH_MAX, "%s/lock", w->dir);       if (r > PATH_MAX) {           twarnx("path too long: %s/lock", w->dir);           return 0;       }          fd = open(path, O_WRONLY|O_CREAT, 0600);       if (fd == -1) {           twarn("open");           return 0;       }          lk.l_type = F_WRLCK;       lk.l_whence = SEEK_SET;       lk.l_start = 0;       lk.l_len = 0;       r = fcntl(fd, F_SETLK, &lk);       if (r) {           twarn("fcntl");           return 0;       }          // intentionally leak fd, since we never want to close it        // and we'll never need it again        return 1;   }  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/a0875b0818f728dd50e99581db8d2e73.html