文件加锁问题

zzhzhua 2009-11-01 12:12:37
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/mman.h>
typedef struct
{
char *GET1;
char *GET2;
}GETX_T;
GETX_T Test(char *str)
{
GETX_T TestGet;
STR PMode = Divide_Para(str);

pid_t pid;
int i, val;
char buf[20];
memset(buf, '\0', sizeof(buf));

creat("/home/zzh/Desktop/Mmap/010", PMode.mode);
int fd = open("/home/zzh/Desktop/Mmap/010", O_RDWR);
write(fd, "Dawning", sizeof("Dawning"));

struct flock lock;
lock.l_type = F_RDLCK;
lock.l_start = 0;
lock.l_whence = SEEK_SET;
lock.l_len = sizeof(buf);

if((pid = fork()) < 0)
{
TestGet.GET1 = strerror(errno);
return TestGet;
}
else if(pid > 0)
{
if(fcntl(fd, F_GETLK, &lock) < 0)
{
TestGet.GET1 = strerror(errno);
return TestGet;
}

sleep(3);

printf("Parent!\n");

if(waitpid(pid, NULL, 0) < 0)
printf("Waitpid(): %s\n", strerror(errno));
}
else
{
sleep(1);

int fp = open("/home/zzh/Desktop/Mmap/010", O_RDONLY | O_NONBLOCK);
if(read(fd, buf, sizeof(buf)) < 0)
{
TestGet.GET1 = strerror(errno);
return TestGet;
}
else printf("Buf: %s\n", buf);
}

return TestGet;
}
int main()
{
GETX_T TestGet = Test();
printf("%s\n%s\n", TestGet.GET1, TestGet.GET2);

return 0;
}
各位大侠,我在父进程中给文件进行排他加锁,可是在子进程中可以读取次文件,就是说锁根本没有效果,请各位大侠帮忙,看看有什么问题啊!谢谢!





--------------------------------------------------------------------------------
网易历六年耗亿资打造,3D国韵网游《天下贰》,免费领光盘
...全文
57 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
XyRbj 2009-11-02
  • 打赏
  • 举报
回复
nod.mark


up mymtom说的没错
yueyinggufan 2009-11-01
  • 打赏
  • 举报
回复
LS正解,建议锁并不是真正锁死了一个文件,只是在这个文件上加了一层“协议”,对于遵循这个协议(其实就是open之后先判断一下是不是加锁了,加锁就不访问)这个锁是有效的,不遵守的它也没办法,所以建议锁仅是帮助程序员为文件做标记,让多进程编程的时候不造成数据错乱,至于强制锁嘛,劝你还是别用了,可以看看这个
http://blog.chinaunix.net/u2/76263/showart_1300378.html
mymtom 2009-11-01
  • 打赏
  • 举报
回复
这是建议锁,不是强制锁,也就是说其他进程不获得锁也可以访问。
快乐田伯光 2009-11-01
  • 打赏
  • 举报
回复
所有的进程线程间的通讯方式都需要进程间一起协作, 所以你父子都应该去试着获取锁. 你直接读当然可以读出来喽.
另外多个进程是同时可以获取读锁的,

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧