#include "apue.h"
#include <fcntl.h>
int lock_reg(int fd, int cmd, int type, off_t offset, int whence, off_t len)
{
struct flock lock;
lock.l_type=type;
lock.l_start=offset;
lock.l_whence=whence;
lock.l_len=len;
return fcntl(fd,cmd, &lock);
}
Function to test for a locking condition
#include "apue.h"
#include <fcntl.h>
int lock_test(int fd, int cmd, int type, off_t offset, int whence, off_t len)
{
struct flock lock;
lock.l_type=type;
lock.l_start=offset;
lock.l_whence=whence;
lock.l_len=len;
if(fcntl(fd,F_GETLK,&lock)<0)
err_sys("fcntl error");
if(lock.l_type==F_UNLCK)
return 0;
return lock.l_pid;
}
Function to test for a locking condition
#include "apue.h"
#include <fcntl.h>
static void lock_byte(const char *name, int fd, off_t offset)
{
if(writew_lock(fd,offset, SEEK_SET,1)<0)
err_sys("%s: writew_lock error", name);
printf("%s: got the lock, byte %lld\n",name, (long long) offset);
}
int main(void)
{
int fd;
pid_t pid;
if((fd=creat("templock",FILE_MODE))<0)
err_sys("creat error");
if(write(fd,"ab",2)!=2)
err_sys("write error");
TELL_WAIT();
if((pid=fork())<0)
{
err_sys("fork error");
}
else if(pid==0)
{
lockabyte("child",fd,0);
TELL_PARENT(getppid());
WAIT_PARENT();
lockabyte("child",fd,1);
}
else
{
lockabyte("parent",fd,1);
TELL_CHILD(pid);
WAIT_CHILD();
lockabyte("parent",fd,0);
}
return 0;
}
Example of deadlock detection
#include "apue.h"
#include <fcntl.h>
int lockfile(int fd)
{
struct flock fl;
fl.l_type=F_WRLCK;
fl.l_start=0;
fl.l_whence=SEEK_SET;
fl.l_len=0;
return fcntl(fd,F_SETFLK,&fl);
}
Place a write lock on an entire file