/* lock_set.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已经被改 */
lock.l_type = type;
/* 根据不同的值进行阻塞是上锁或解锁 */
if(fcntl(fd,F_SETLKW,&lock) < 0)
{
printf("Lock failed:type=%d\n",lock.l_type);
return 1;
}
switch(lock.l_type)
{
case F_RDLCK:
{
printf("Read lock lock by %d\n",getpid());
}
break;
case F_WRLCK:
{
printf("Write lock set by %d\n",getpid());
}
break;
case F_UNLCK:
{
printf("Release lock by %d\n",getpid());
}
break;
default: break;
}
return 0;
}
/* read_lock.c */
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "lock_set.c"
int main(int argc,char *argv[])
{
int fd;
if(argc != 2)
{
printf("Usage:./read_lock (file).\n");
exit(1);
}
/* open file */
fd = open(argv[1],O_RDWR | O_CREAT,S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
if(fd < 0)
{
printf("Open file error\n");
exit(1);
}
/* lock file fd */
lock_set(fd,F_RDLCK);
getchar();
/* unlock file fd */
lock_set(fd,F_UNLCK);
getchar();
close(fd);
exit(0);
}
终端1
tanyouliang@ubuntu:~/8/fileio$ ./read_lock cp
Read lock lock by 19394
d
Release lock by 19394
终端2
tanyouliang@ubuntu:~/8/fileio$ ./read_lock cp
Read lock lock by 19396
a
Release lock by 19396