分类: LINUX
2011-05-27 10:16:48
项目中涉及数据的读取和发送,由于对线程不熟悉,我将读取和发送分成了两个独立的程序,先实现功能再更新为多线程版本。但两个程序共用一个文件时同样会出现同步问题。所以必须加锁。
这次选择的是lockf。在实验时a.b程序交替往同一文件写东西需要注意的
(错误 版本)--》由于每次解锁都是对后面的部分解锁,所以b程序仍然无法获得可写的锁,所以结果是a程序一直写,等结束了,b才可以写。
for(i=0;i<3;i++)
9 {
10 print_time("a start lock");
12 lockf(fd,F_LOCK,0);
13 print_time("a get lock");
14 buff_a[2]=i+'0';
16 write(fd,buff_a,4);
17 sleep(5);
19 lockf(fd,F_ULOCK,0);
20 print_time("a reless lock");
22 sleep(1);
23 }
(正确版本1)--》为解决解锁问题,我们在每次写完后立即调用fclose来达到关闭锁的目的。
for(i=0;i<3;i++)
{
Open(&fd);
print_time("a start lock");
lockf(fd,F_LOCK,0);
print_time("a get lock");
buff_a[2]=i+'0';
write(fd,buff_a,4);
sleep(5);
// lockf(fd,F_ULOCK,0); ---》此指令是释放目前到后面的锁。如果没有后面的close,b仍然无法获取锁。
print_time("a reless lock");
close(fd);--》关闭文件IO,可以释放前面所加的锁。
sleep(2);
}
return 0;
(正确版本2)--》如果不关闭IO,可以通过lseek指针的移动来达到完整加锁和完整解锁的目的,这样a,b程序可以正确的依次往共用文件里写东西。
Open(&fd);
8 for(i=0;i<3;i++)
9 {
10 print_time("a start lock");
11 lseek(fd,SEEK_SET,0);
12 lockf(fd,F_LOCK,0);
13 print_time("a get lock");
14 buff_a[2]=i+'0';
15 lseek(fd,SEEK_END,0);--》因为是添加到文件末尾,所以要移动指针。
16 write(fd,buff_a,4);
17 sleep(5);
18 lseek(fd,SEEK_SET,0);--》必须对全部文件解锁,这样b才可以得到写的权限。
19 lockf(fd,F_ULOCK,0);
20 print_time("a reless lock");
21 //close(fd);
22 sleep(1);
23 }