读APUE记录锁遇到的问题

作者:用户 来源:互联网 浏览:306 次 时间:2016-01-05 19:08:00

记录锁

读APUE记录锁遇到的问题 - 摘要: 读APUE记录锁遇到的问题我的程序是父,子2个进程尝试对一个打开的文件的同一区域加写锁。先让子进程获得锁,然后再让父进程去锁。按正常的运行,应该是父进程测试锁时会发现已有一个排斥它的锁存在,但是实际程

问题描述

读APUE记录锁遇到的问题

我的程序是父,子2个进程尝试对一个打开的文件的同一区域加写锁。先让子进程获得锁,然后再让父进程去锁。按正常的运行,应该是父进程测试锁时会发现已有一个排斥它的锁存在,但是实际程序运行却发现父进程会发现可以加锁。代码如下:

 void pflock(struct flock *fl){    printf(""fl.l_type:%dfl.l_whence::%dfl.l_start:%dfl.l_len:%dfl.l_pid:%lun""fl->l_typefl->l_whencefl->l_startfl->l_len(long)fl->l_pid);}int main(void){    int fd ret;    pid_t pid;    struct flock fl;    fd = open(""./d"" O_RDWR);    if ( fd < 0 )    {        perror(""open"");        return -1;    }    pid = fork();    if ( pid < 0 )    {        perror(""fork"");        close(fd);        return -1;    }    else if ( pid == 0 )    {        printf(""child pid:%lun""(long)getpid());        fl.l_type = F_WRLCK;        fl.l_whence = SEEK_SET;        fl.l_start = 1;        fl.l_len = 2;        fl.l_pid = getpid();        ret = fcntl(fd F_GETLK &fl);        if ( fl.l_type != F_UNLCK )        {            printf(""already have a file lockn"");            pflock(&fl);            close(fd);            exit(0);        }        printf(""child set flockn"");        ret = fcntl(fd F_SETLK &fl);        if ( ret < 0 )        {            perror(""fcntl"");            close(fd);            exit(0);        }        while(1);    }    else    {        printf(""parent pid:%lun""(long)getpid());        sleep(1);   //let child process get a flock before parents        fl.l_type = F_WRLCK;        fl.l_whence = SEEK_SET;        fl.l_start = 1;        fl.l_len = 2;        fl.l_pid = getpid();        ret = fcntl(fd F_GETLK &fl);        if ( fl.l_type != F_UNLCK )        {            printf(""already have a file lockn"");            pflock(&fl);            close(fd);            exit(0);        }        printf(""parent set flockn"");        ret = fcntl(fd F_SETLK &fl);        if ( ret < 0 )        {            perror(""fcntl"");            close(fd);            exit(0);        }        while(1);    }    close(fd);    exit(0);}

按我的预期是,父进程在 if ( fl.l_type != F_UNLCK ) 这个判断中会退出。而实际运行却发现程序继续运行了下去,并加了写锁。

解决方案

按我的预期是,父进程在 if ( fl.l_type != F_UNLCK ) 这个判断中会退出

解决方案二:

自己粗心导致的错误,子进程F_GETLK后,type类型变为UNLCK(这里在F_SETLK前要再次设置为F_WRLCK),CSDN不知道怎么关闭问题,自己粗心闹了个笑话

【云栖快讯】阿里云栖开发者沙龙(Java技术专场)火热来袭!快来报名参与吧!  详情请点击
云栖社区(yq.aliyun.com)为您免费提供读APUE记录锁遇到的问题相关信息,包括 记录锁 的信息 ,所有读APUE记录锁遇到的问题相关内容均不代表云栖社区的意见! 该页面h5页面的地址是:https://m.aliyun.com/yunqi/wenzhang/show_87369,您可以点击读APUE记录锁遇到的问题-手机站访问。
阿里云总监课第五期重磅上线!
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率

40+云计算产品,6个月免费体验

现在注册,免费体验40+云产品,及域名优惠!

云服务器9.9元/月,大学必备

热点导航