加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

UNIX环境高级编程:记录上锁(fcntl函数)以及死锁检测

发布时间:2016-09-27 12:24:10 所属栏目:Unix 来源:站长网
导读:副标题#e# 一、记录锁 record locking 功能:当一个进程正在读或修改文件的某个部分时,它可以阻止其它进程修改同一文件区。 字节范围锁 byte-range locking 二、历史 flock函数,可以锁整个文件,不能锁文件中的一部分。 fcntl函数,增加了记录锁的功能。

程序的执行结果如下:

huangcheng@ubuntu:~$ ./a.out
child get read lock...  
close the file descriptor...  
parent get write lock...

运行结果说明:当关闭文件描述符时,与该文件描述符有关的锁都被释放,同样通过dup拷贝得到的文件描述符也会导致这种情况。

(2)由fork产生的子进程不继承父进程所设置的锁。即对于父进程建立的锁而言,子进程被视为另一个进程。记录锁本身就是用来同步不同进程对同一文件区进行操作,如果子进程继承了父进程的锁,那么父子进程就可以同时对同一文件区进行操作,这有违记录锁的规则,所以存在这么一条规则。

下面是测试代码(上面已经用过该代码进行测试):

#include <stdio.h>  
#include <stdlib.h>  
#include <unistd.h>  
#include <fcntl.h>  
#include <sys/stat.h>  
#include <sys/types.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 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;  
}  
      
pid_t lock_test(int fd, short type, short whence, off_t start, off_t len)  
{  
    struct flock lock;  
    lock_init(&lock, type, whence, start, len);  
      
    if (fcntl(fd, F_GETLK, &lock) == -1)  
    {  
        return -1;  
    }  
      
    if(lock.l_type == F_UNLCK)  
        return 0;  
    return lock.l_pid;  
}  
      
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);  
    writew_lock(fd);  
      
    if (fork() == 0)  
    {  
        printf("child F_WRLCK return %dn",lock_test(fd, F_WRLCK, SEEK_SET, 0, 0));  
        printf("child F_RDLCK return %dn",lock_test(fd, F_RDLCK, SEEK_SET, 0, 0));  
        printf("child pid = %d and ppid = %dn",getpid(),getppid());  
      
        exit(0);  
    }  
      
    sleep(3);  
    unlock(fd);  
      
    return 0;  
}

查看本栏目更多精彩内容:http://www.bianceng.cn/OS/unix/

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读