分类: LINUX
2011-03-16 19:36:42
对于写程序来说,单独拿出一句,很容易看出中的问题,但是在一个大的程序来说,却不容易找到,而一时的疏忽可能导致很大的影响。就举个例子来说。
同学让我帮忙调试一个锁的测试程序,但总是不成功。
程序如下:
//文件test1.c
#include
#include
#include
#include
int lockfile(int fd)
{
struct flock f1;
f1.l_type=F_WRLCK;
f1.l_start=0;
f1.l_whence=SEEK_SET;
f1.l_len=0;
return(fcntl(fd,F_SETLKW,&f1));
}
int main ()
{
int fd;
if(fd=open("2.txt",O_WRONLY|O_APPEND)<-1)
{
printf("can't open 2.txt\n");
}
if(lockfile(fd)==-1)
{
printf("can't lock 2.txt\n");
}
printf("lalala\n");
sleep(20);
close(fd);
return 0;
}
//文件test2.c
#include
#include
#include
#include
int lockfile(int fd)
{
struct flock f1;
f1.l_type=F_WRLCK;
f1.l_start=0;
f1.l_whence=SEEK_SET;
f1.l_len=0;
return(fcntl(fd,F_SETLKW,&f1));
}
int main ()
{
int fd;
if(fd=open("2.txt",O_WRONLY|O_APPEND)<-1)
{
printf("can't open 2.txt\n");
}
if(lockfile(fd)==-1)
{
printf("can't lock 2.txt\n");
}
printf("abcd\n");
close(fd);
return 0;
}
测试时这个文件总是锁不住。
找了很长时间也没找到原因所在。
最终发现结果出在if(fd=open("2.txt",O_WRONLY|O_APPEND)<-1)这句话,赋值操作符的优先级要低于比较运算符"<",所以这会先执行open("2.txt",O_WRONLY|O_APPEND)<-1结果为负数,然后将这个负数负给fd,所以fd的值不是应该正常返回的文件描述符。