免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2944 | 回复: 7
打印 上一主题 下一主题

在同一进程里,怎么测试出一个文件有没上锁,而且最好是锁的类型也能知道。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-23 23:08 |只看该作者 |倒序浏览
我试图用fcntl(..., F_GETLK,...)来测试一个文件是否被锁。发现一个进程锁文件,
一个进程测试是否锁是可行的。但是如果锁文件,测试是否锁了,这俩个动作在同一进程中
测试结果就失效了。不知道大伙有没测试出文件被同一进程上锁的好方法。也就是在下面的
输出中,程序不会走“parent lock can be successful”这个分支,而走
“parent lock failed for lock-write by。。。” 或者
“parent lock failed for lock-read by 。。。”

先谢谢大家了。

./a.out
I am the child process, my process id is 16408
I am the parent process, my process id is 16407
parent locking..
parent lock can be successful
child testing lock...
child lock failed for lock-read by 16407




#include<stdio.h>
#include<sys/file.h>
#include <fcntl.h>
#include <unistd.h>

int main()
{
    FILE *fp;
    int fd;
    struct flock lock;
    struct flock getedLock;
    pid_t pid;

    getedLock.l_whence = lock.l_whence = 0;
    getedLock.l_start = lock.l_start  = 0;
    getedLock.l_len = lock.l_len    = 0L;
    getedLock.l_type = F_WRLCK;

    if (!(fp = fopen("testlock.cel","r+"))) {
        printf("can't open file.\n");
        return 1;
    }
    fd = fileno(fp);

    pid = fork();
    if (pid < 0) {
       printf("error in fork!");
    } else if (pid == 0) {
        printf("I am the child process, my process id is %d\n",getpid());
        sleep(3);
        printf("child testing lock...\n");
        getedLock.l_pid = getpid();
        if(fcntl(fd, F_GETLK, &getedLock) == -1) {
            printf("Child geting lock failed\n");
            return 0;
        }
        if (getedLock.l_type == F_WRLCK) {
            printf("child lock failed for lock-write by %d\n", getedLock.l_pid);
        } else if (getedLock.l_type == F_RDLCK) {
            printf("child lock failed for lock-read by %d\n", getedLock.l_pid);
        } else if (getedLock.l_type == F_UNLCK) {
            printf("child lock can be successful\n");
        }
        sleep(3);
        return 0;
    } else {
        printf("I am the parent process, my process id is %d\n",getpid());

        printf("parent locking..\n");
        lock.l_pid    = getpid();

        lock.l_type = F_RDLCK;
        if(fcntl(fd, F_SETLK, &lock) == -1 ) {
            printf("Parent process failed to lock file to %s\n",(lock.l_type == F_WRLCK) ? "write" : "read");
            return 0;
        }

        if(fcntl(fd, F_GETLK, &getedLock) == -1) {
            printf("Child geting lock failed\n");
            return 0;
        }
        if (getedLock.l_type == F_WRLCK) {
            printf("parent lock failed for lock-write by %d\n", getedLock.l_pid);
        } else if (getedLock.l_type == F_RDLCK) {
            printf("parent lock failed for lock-read by %d\n", getedLock.l_pid);
        } else if (getedLock.l_type == F_UNLCK) {
            printf("parent lock can be successful\n");
        }

        sleep(10);
    }
    return 0;
}

论坛徽章:
0
2 [报告]
发表于 2008-07-24 00:52 |只看该作者
同一个进程对同一个区域进行测试,结果总是可以上锁的。
你的要求没法做到!!
换句话说,同一个进程,同一把锁,总是可以SETLK的,而且总是成功的。

因此除非你想用SETLK进行轮询,否则GETLK是没有意义的:)但是GETLK和SETLK之间并不是原子操作,你还是需要SETLKW来做。

论坛徽章:
0
3 [报告]
发表于 2008-07-24 10:01 |只看该作者

回复 #2 ivhb 的帖子

那不知道有什么方法,可以查询到文件上锁的情况,包括同一进程和不同进程对该文件上的锁?

论坛徽章:
1
双子座
日期:2015-01-04 14:25:06
4 [报告]
发表于 2008-07-24 10:06 |只看该作者
同一进程
你加锁的时候记录一下
解锁的时候记录一下不就行了

论坛徽章:
0
5 [报告]
发表于 2008-07-24 10:20 |只看该作者
请参考flw同学的签名.

论坛徽章:
0
6 [报告]
发表于 2008-07-25 12:39 |只看该作者
en, 也是. 谢谢大家了

论坛徽章:
0
7 [报告]
发表于 2008-07-25 12:47 |只看该作者

回复 #5 converse 的帖子

请参考flw同学的签名? 这个我哪里找?

论坛徽章:
0
8 [报告]
发表于 2008-07-25 13:20 |只看该作者
原帖由 tylsophie 于 2008-7-25 12:47 发表
请参考flw同学的签名? 这个我哪里找?


如何知道一个变量是什么类型?
如何知道分配的内存有多大?
如何知道 select 的 fd_set 里哪个句柄是无效的?
如何知道指针是不是有效的?
如何通过文件句柄得到文件名?
……
如何知道我昨晚把袜子脱哪儿了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP