文件上锁

/* * 1-3.c * * Created on: 2010-12-29 * Author: jinyong * 文件上锁 */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/file.h> #include <sys/types.h> #include <sys/stat.h> /** * int flock(int fd, int operation); * 功能:锁定文件或解除锁定(加建议性锁) * 注:单一文件无法同时建立共享锁定和互斥锁定。 * operation值: * LOCK_SH 共享锁定。多个进程可同时对一个文件作共享锁定 * LOCK_EX 建立互斥锁定。一个文件同时只有一个互斥锁定 * LOCK_UN 解除文件锁定。 * LOCK_NB 无法建立锁定时,此操作可不被阻断,马上返回进程。 * 成功返回0,失败-1,错误代码存于errno */ void lock_set(int fd, int type) { struct flock lock; lock.l_whence = SEEK_SET; lock.l_start = 0; lock.l_len = 0; while(1) { lock.l_type = type; if( (fcntl(fd,F_SETLK, &lock) == 0 )) //根据不同的type给文件上锁或解锁 { /** * int fcntl(int fd,int cmd); * int fcntl(int fd,int cmd,long arg); * int fcntl(int fd,int cmd,struct flock *lock); * 功能:文件描述符操作,加强制性锁 * fd 文件描述符 * cmd 操作类型 * lock 记录锁的具体状态 * 成功返回0,失败-1,错误代码存于errno */ if(lock.l_type == F_RDLCK) //F_RDLK为共享锁 printf("加上读取锁的是:%d/n",getpid()); else if( lock.l_type == F_WRLCK)//F_WRLCK为排斥锁 printf("加上写入锁的是:%d/n",getpid()); else if( lock.l_type == F_UNLCK) printf("释放强制性锁:%d/n",getpid()); return; } fcntl(fd, F_GETLK, &lock); if(lock.l_type != F_UNLCK) { if( lock.l_type == F_RDLCK ) printf("加上的读取锁是:%d/n",lock.l_pid); else if( lock.l_type == F_WRLCK ) printf("加上的写入锁是:%d/n",lock.l_pid); getchar(); } } } int main(void) { int fd; fd = open("/home/jinyong/4-6file",O_RDWR|O_CREAT,0666); if(fd < 0) { perror("打开失败"); exit(1); } lock_set(fd, F_WRLCK); getchar(); lock_set(fd, F_UNLCK); getchar(); close(fd); exit(0); }  

你可能感兴趣的:(struct,cmd,File,2010)