免费注册 查看新帖 |

Chinaunix

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

请问下这段代码怎么文件锁没起作用阿? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-04 20:31 |只看该作者 |倒序浏览
本帖最后由 digu 于 2010-09-04 21:42 编辑
  1. #include <fcntl.h>
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <sys/stat.h>

  5. int main()
  6. {
  7.         char buf[] = "abcde";
  8.         int fd = open("file", O_RDWR | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO);
  9.         write(fd, buf, 5);
  10.         struct flock lock1;
  11.         lock1.l_type = F_WRLCK;
  12.         lock1.l_start = 0;
  13.         lock1.l_whence = SEEK_SET;
  14.         lock1.l_len = 0;
  15.         fcntl(fd, F_SETLK, &lock1);
  16.         printf("parent pid:%d\n", getpid());
  17.         pid_t pid = fork();
  18.         if (pid == 0)
  19.         {
  20.                 struct flock lock2;
  21.                 fcntl(fd, F_GETLK, &lock2);
  22.                 printf("child file locked by process: %d\n", lock2.l_pid);
  23.                 lseek(fd, 0, SEEK_SET);
  24.                 if (write(fd, "ddddd" ,5) < 0)
  25.                         fprintf(stderr, "child write locked~~~\n");
  26.         }

  27.         waitpid(pid, NULL, 0);
  28.         return 0;
  29. }

复制代码
linux下得到file文件的内容是ddddd
父进程设置了文件锁,子进程中为什么还能修改文件锁定部分

加了一段测试代码显示子进程中file文件是加锁了的。
请指点一下,谢谢了~

论坛徽章:
0
2 [报告]
发表于 2010-09-04 21:17 |只看该作者
楼主将父进程执行sleep(2)换成waitpid(pid, NULL, 0)就可以了...总之..一定要在子进程退出之前...
父进程才能退出... 这样才能达到你想要的目的...

       你仅仅让父进成执行sleep(2), 不能保证父进程在退出之前. 子进程就已经执行write系统调用,并且已经执行完了....
  
        拥有记录锁的进程在退出之后, 这个锁就不起作用了...

论坛徽章:
0
3 [报告]
发表于 2010-09-04 21:33 |只看该作者
楼主将父进程执行sleep(2)换成waitpid(pid, NULL, 0)就可以了...总之..一定要在子进程退出之前...
父进程才 ...
PCliangtao 发表于 2010-09-04 21:17



    还是不对阿,file文件的内容还是 ddddd

论坛徽章:
0
4 [报告]
发表于 2010-09-04 21:53 |只看该作者
汗... 我刚刚自己编写了代码试了一下.... 的确是没有起作用...
     我在子进程中用F_GETLK获取了锁的信息... flock结构中的pid字段是父进成的PID...表示这个记录锁
     是父进程的...
    可是为何子进程依旧能够向文件中写入东西... 的确很费解... 可能就是实现的版本问题吧...

    并不像书中说的对于fork出的子进程,不进程父进程所设置的锁.......

     我又写了一下测试..其中一个进程锁住FILE文件...然后一直循环... 然后另外一个进程试图向这个上锁的文件写入东西... 但是仍然能够写入这个文件... 但是如果这个进程试图对这个文件再次上锁...则会失败...
  
      莫非所强制性索和建议性锁引起的问题?  继续测试测试....

论坛徽章:
0
5 [报告]
发表于 2010-09-04 22:03 |只看该作者
难道原因在于锁只是建议性锁,而这里的父子进程不是合作进程,所以建议性锁无效?



但还是迷糊的,继续查资料,继续期待高人解答~

论坛徽章:
0
6 [报告]
发表于 2010-09-04 22:11 |只看该作者
的确所建议性锁与强制性锁有区别引起的问题....

建议性锁是这样规定的:每个使用上锁文件的进程都要检查是否有锁存在,当然还得尊重已有的锁。内核和系统总体上都坚持不使用建议性锁,它们依靠程序员遵守这个规定。  也就是说:如果进程不尊重锁,则进程在没有获得锁的情况下也可以对一个已经被别的进程加写锁的文件进行读写。尊重该锁的所有进程被称为合作进程 (cooperating process)。所以只有在文件只在合作进程间存取时才是安全的。

论坛徽章:
0
7 [报告]
发表于 2010-09-04 22:13 |只看该作者
的确所建议性锁与强制性锁有区别引起的问题....
PCliangtao 发表于 2010-09-04 22:11



    明白了,谢谢~~

看来我还需要去找找关于合作进程概念方面的东西看看。

apue那本书感觉这里讲的好晦涩啊。

论坛徽章:
0
8 [报告]
发表于 2010-09-04 22:16 |只看该作者
包括的东西很全... 做个入门就够了... 其他深入的地方自己再去看别的资料...再加上实践来加深理解...

    APUE我都所当作参考书来看的... 有些API以及常量容易忘记... 经常翻一翻... 呵呵...

   开始也只是想当然的这样回答... 还得感谢你提出这个问题.... 自己测试了一下... 才想到有建议性锁和强制性锁的差别...

论坛徽章:
0
9 [报告]
发表于 2010-09-04 22:23 |只看该作者
包括的东西很全... 做个入门就够了... 其他深入的地方自己再去看别的资料...再加上实践来加深理解...

  ...
PCliangtao 发表于 2010-09-04 22:16



    我刚linux编程入门呢,没办法,怎么都要把这本书啃一遍,至少以后当参考书能知道要找的东西在哪个地方。

要不就只能抓瞎了~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP