UNIX环境高级编程:记录上锁(fcntl函数)以及死锁检测
发布时间:2016-09-27 01:53:07 所属栏目:Unix 来源:站长网
导读:副标题#e# 一、记录锁 record locking 功能:当一个进程正在读或修改文件的某个部分时,它可以阻止其它进程修改同一文件区。 字节范围锁 byte-range locking 二、历史 flock函数,可以锁整个文件,不能锁文件中的一部分。 fcntl函数,增加了记录锁的功能。
对于第二个方面,可以进行如下测试: #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); if (fork() == 0) { int fd_1 = open(FILE_PATH, O_RDWR | O_CREAT, FILE_MODE); readw_lock(fd_1); printf("child get read lock...n"); sleep(3); close(fd_1); printf("close the file descriptor...n"); pause(); } sleep(1); writew_lock(fd); printf("parent get write lock...n"); unlock(fd); return 0; } (编辑:云计算网_泰州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |