免费注册 查看新帖 |

Chinaunix

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

[学习] APUE记录锁问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-12-28 21:48 |只看该作者 |倒序浏览
    我的程序是父,子2个进程尝试对一个打开的文件的同一区域加写锁。先让子进程获得锁,然后再让父进程去锁。按正常的运行,应该是父进程测试锁时会发现已有一个排斥它的锁存在,但是实际程序运行却发现父进程会发现可以加锁。代码如下:
  1. void pflock(struct flock *fl)
  2. {
  3.     printf("fl.l_type:%d,fl.l_whence::%d,fl.l_start:%d,fl.l_len:%d,fl.l_pid:%lu\n",fl->l_type,fl->l_whence,fl->l_start,fl->l_len,(long)fl->l_pid);
  4. }
  5. int main(void)
  6. {
  7.     int fd, ret;
  8.     pid_t pid;
  9.     struct flock fl;
  10.    
  11.     fd = open("./d", O_RDWR);
  12.     if ( fd < 0 )
  13.     {
  14.         perror("open");
  15.         return -1;
  16.     }

  17.     pid = fork();
  18.     if ( pid < 0 )
  19.     {
  20.         perror("fork");
  21.         close(fd);
  22.         return -1;
  23.     }
  24.     else if ( pid == 0 )
  25.     {
  26.         printf("child pid:%lu\n",(long)getpid());
  27.         fl.l_type = F_WRLCK;
  28.         fl.l_whence = SEEK_SET;
  29.         fl.l_start = 1;
  30.         fl.l_len = 2;
  31.         fl.l_pid = getpid();
  32.         
  33.         ret = fcntl(fd, F_GETLK, &fl);
  34.         if ( fl.l_type != F_UNLCK )
  35.         {
  36.             printf("already have a file lock\n");
  37.             pflock(&fl);
  38.             close(fd);
  39.             exit(0);
  40.         }

  41.         printf("child set flock\n");
  42.         ret = fcntl(fd, F_SETLK, &fl);
  43.         if ( ret < 0 )
  44.         {
  45.             perror("fcntl");
  46.             close(fd);
  47.             exit(0);
  48.         }
  49.         while(1);
  50.     }
  51.     else
  52.     {
  53.         printf("parent pid:%lu\n",(long)getpid());
  54.         sleep(1);   //let child process get a flock before parents
  55.         
  56.         fl.l_type = F_WRLCK;
  57.         fl.l_whence = SEEK_SET;
  58.         fl.l_start = 1;
  59.         fl.l_len = 2;
  60.         fl.l_pid = getpid();
  61.         
  62.         ret = fcntl(fd, F_GETLK, &fl);
  63.         if ( fl.l_type != F_UNLCK )
  64.         {
  65.             printf("already have a file lock\n");
  66.             pflock(&fl);
  67.             close(fd);
  68.             exit(0);
  69.         }
  70.         
  71.         printf("parent set flock\n");
  72.         ret = fcntl(fd, F_SETLK, &fl);
  73.         if ( ret < 0 )
  74.         {
  75.             perror("fcntl");
  76.             close(fd);
  77.             exit(0);
  78.         }
  79.         while(1);
  80.     }

  81.     close(fd);
  82.     exit(0);
  83. }
复制代码
按我的预期是,父进程在 if ( fl.l_type != F_UNLCK ) 这个判断中会退出。而实际运行却发现程序继续运行了下去,并加了写锁。

论坛徽章:
0
2 [报告]
发表于 2015-12-29 16:11 |只看该作者
问题已解决,是自己粗心导致,子进程测试是否有锁时,type类型被修改为F_UNLCK,设置锁时,忘记将类型重新改回为F_RDLC。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP