2011-07-28更新:
收到两个朋友的邮件,问我semget()返回0的原因,我觉得我在几年前的文章中说的很清楚了啊,难道是我表达有问题????简单的说,就是包含semget()的判断语句少了括号,运算符优先级的问题,如果不清楚,再复习下C语言。我用红色标出了少了的那对括号。
几个月前,我的程序出现过这种情况,后来自己解决了。昨天有朋友发邮件问我是怎么解决的,告诉他之后,发现他的错误和我的一样。。。那就在这说一下吧,如果你的也返回0,请检查一下代码。
我之前出现这种情况的代码是这样的:
......
if(semfd = semget(....)==key) //semfd和key已经声明
......
而我的本意是想这样:
......
if((semfd = semget(.....))==key)
......
可以看到,开始的代码,逻辑有问题,很明显的问题,似乎我们第一天开始学习C语言时,老师就教育我们不要犯这种错误。但是我检查了很久,才发现这个错误的。细究根源,是我参考的书上有类似的代码,误导了我。让我认为函数的调用没有错误,并且semget返回了0。
现在很多中文版的linuxC编程书籍,其中错误百出。我手头的这本有错误的书,就是《linux下的C编程》,贾明、严世贤编著,雨人科技策划,人民邮电出版社出版的。在此指出,其他朋友在读这本书的时候还是注意一下吧。
随便举几个错误的地方:
290页倒数第二行:
if ( semid=semget ( IPC_PRIVATE,SEM_NUM,SEM_MODE ) ) ==-1 ) //左右括号数不一致。
297页safesemget()函数中:
if(retval=semget(key,nsems,semflg)==-1) //这样恐怕看不出有什么问题,看看这个函数在这本书中是如何调用的吧。。。
此函数的调用(293页最后一行):
semid=safesemget(IPC_PRIVATE,2,SHM_RISHM_W);
看到了吧,我当时就是被这函数例子给误导了,出现了第一种错误。当然,也怪我,用的时候没有思考一下,人家怎么写,我就怎么用,偷懒了。
之前还看过一本linnxC的书,也是错误百出,忘了叫什么名字了,并且这两本书中的例子,很多都相同,真服了。。。。