Chinaunix首页 | 论坛 | 博客
  • 博客访问: 541949
  • 博文数量: 64
  • 博客积分: 1591
  • 博客等级: 上尉
  • 技术积分: 736
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-08 14:54
文章分类

全部博文(64)

文章存档

2011年(42)

2010年(22)

分类: LINUX

2011-03-16 19:36:42

编程时遇到的一个C语言问题

对于写程序来说,单独拿出一句,很容易看出中的问题,但是在一个大的程序来说,却不容易找到,而一时的疏忽可能导致很大的影响。就举个例子来说。

同学让我帮忙调试一个锁的测试程序,但总是不成功。

程序如下:

//文件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的值不是应该正常返回的文件描述符。

阅读(1969) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~