UNIX环境高级编程:记录上锁(fcntl函数)以及死锁检测
发布时间:2016-10-12 20:18:11 所属栏目:Unix 来源:网络整理
导读:一、记录锁 record locking 功能:当一个进程正在读或修改文件的某个部分时,它可以阻止其它进程修改同一文件区。 字节范围锁 byte-range locking 二、历史 flo
|
我们知道在前面已经说过,同一个进程可以重复对同一个文件区间加锁,后加的锁将覆盖前面加的锁。那么再假设如果子进程继承了父进程的锁,那么子进程可以对该锁进行覆盖,那么在子进程内对该锁是否能获得权限的测试应该是可以,但测试结果为: huangcheng@ubuntu:~$ ./a.out child F_WRLCK return 7483 child F_RDLCK return 7483 child pid = 7484 and ppid = 7483 表明已经进程7483已经占用该锁,所以假设不成立,子进程不会继承父进程的锁; (3)执行exec后,新程序可以继承原执行程序的锁。但是,如果一个文件描述符设置了close-on-exec标志,在执行exec时,会关闭该文件描述符,所以对应的锁也就被释放了,也就无所谓继承了。 六、记录锁的读和写的优先级 具体进行以下2个方面测试: 进程拥有读锁,然后优先处理后面的读锁,再处理写锁,导致写锁出现饿死; 进程拥有写入锁,那么等待的写入锁和等待的读出锁的优先级(FIFO); 测试1:父进程获得对文件的读锁,然后子进程1请求加写锁,随即进入睡眠,然后子进程2请求读锁,看进程2是否能够获得读锁。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#define FILE_PATH "/home/huangcheng/data.txt"
#define FILE_MODE 0777
void lock_init(struct flock *lock, short type, short whence, off_t start, off_t len)
{
if (lock == NULL)
return;
lock->l_type = type;
lock->l_whence = whence;
lock->l_start = start;
lock->l_len = len;
}
int readw_lock(int fd)
{
if (fd < 0)
{
return -1;
}
struct flock lock;
lock_init(&lock, F_RDLCK, SEEK_SET, 0, 0);
if (fcntl(fd, F_SETLKW, &lock) != 0)
{
return -1;
}
return 0;
}
int writew_lock(int fd)
{
if (fd < 0)
{
return -1;
}
struct flock lock;
lock_init(&lock, F_WRLCK, SEEK_SET, 0, 0);
if (fcntl(fd, F_SETLKW, &lock) != 0)
{
return -1;
}
return 0;
}
int unlock(int fd)
{
if (fd < 0)
{
return -1;
}
struct flock lock;
lock_init(&lock, F_UNLCK, SEEK_SET, 0, 0);
if (fcntl(fd, F_SETLKW, &lock) != 0)
{
return -1;
}
return 0;
}
int main()
{
int fd = open(FILE_PATH, O_RDWR | O_CREAT, FILE_MODE);
readw_lock(fd);
//child 1
if (fork() == 0)
{
printf("child 1 try to get write lock...n");
writew_lock(fd);
printf("child 1 get write lock...n");
unlock(fd);
printf("child 1 release write lock...n");
exit(0);
}
//child 2
if (fork() == 0)
{
sleep(3);
printf("child 2 try to get read lock...n");
readw_lock(fd);
printf("child 2 get read lock...n");
unlock(fd);
printf("child 2 release read lock...n");
exit(0);
}
sleep(10);
unlock(fd);
return 0;
}
(编辑:佛山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
