今天写程序时,用到了pthread_cond_timedwait 函数,其原型为:int pthread_cond_timedwait(pthread_cond_t *restrict cond , pthread_mutex_t *restrict mutex, const struct timespec *restrict abstime); 最后一个参数是 timespec 结构体,可惜man里面没有给出具体定义,只好自己去查了。下面就说下具体步骤,也算给大家做个参考,同时欢迎提供更好的方法:
1,符号定义基本都在/usr/include文件夹下可以找到(想想自己程序中引用的头文件就明白了)。那么我们就可以在/usr/include 文件夹下搜索该结构体定义。输入shell命令:grep 'struct timespec' /usr/include/*.h 回车,观察结果,
从结果中(尤其最后几行),我们可以很容易发现,struct timespec 结果体被定义在了/usr/include/time.h 文件中。
2,打开time.h文件,查看具体定义。操作步骤:输入shell命令:vi /usr/include/time.h 回车 。然后在vi编辑器中搜索struct timespec 即可找到该结构体的具体定义(对vi编辑器使用不熟的童鞋,请自觉google,baidu)。如下图所示:
3,如果查看了该结构体的具体定义,你还不满意,仍旧对结构体成员中__time_t 这个数据类型耿耿于怀的话,那我们就继续。按照查找struct timespec 结构体时的方法,查找 __time_t 到底是由什么基本数据类型来定义的。输入shell命令:grep '__time_t' /usr/include/*.h 回车,结果如下:
注意,图中标出的一句话:它明确的告诉我们:在 /usr/include/bits/types.h 文件中,为我们定义了符号 __time_t 。
4,用vi 编辑器打开文件types.h 文件,搜索 __time_t , 结果如下:
此时,各位童鞋是不是有种泪奔的感觉,反正我有了……可是轻易放弃不是咱程序猿的臭脾气啊,带着一股倔劲,继续!红线框中的那一句告诉我们:__time_t 是从Epoch开始的秒数(Epoch:Unix时间戳,代表一个特定的时间:1970-01-01 00:00:00 UTC,不了解的请baidu),而且被定义成了标准数据类型__TIME_T_TYPE , 接下来,你猜到我要干什么了吗?对了,就是重复上边的步骤,查查 __TIME_T_TYPE 到底是个啥玩意。
5,输入shell命令:grep '__TIME_T_TYPE' /usr/include/*.h 回车,发现啥也没找到。仔细一想,第四步中,types.h 文件在/usr/include/bits/ 文件夹下,那么它的定义也很有可能就在这哦,接着输入shell命令:grep '__TIME_T_TYPE' /usr/include/bits/*.h 回车,结果如下:(也可以直接用:grep '__TIME_T_TYPE' /usr/include/*/*.h 表示搜索本目录和子目录,建议一般别搜索子目录,耗时间呀)
看到这里,我们就明白了,__Time_T_TYPE 被定义在了文件typesize.h 中,但我们无需打开文件,注意后边那个单词:__SLONGWORD_TYPE 表示__TIME_T_TYPE 被定义成了 __SLONGWORD_TYPE 类型。我们知道,WORD_TYPE 这种类型基本上都和具体的机器位数有关了。它表示:具体机器上的一个长型字。
6,如果想查看具体自己机器上是什么基本类型的话(机器类型定义在/usr/include/bits/types.h文件中),可以输入shell命令:grep 'SLONGWORD_TYPE' /usr/include/bits/types.h 回车(如果忘了在哪个文件中,也可以直接搜索所有目录:grep 'SLONGWORD_TYPE' /usr/include/*/*.h),结果如下:
至此,大功告成,在我的机器上,__SLONGWORD_TYPE 就是 long int 类型……