我需要初始化一个 Posix 计时器,我让它工作了,但有点奇迹。我不明白工作和代码之间的区别,这给了我分段错误。
这是create_timer函数的标头:
int timer_create(clockid_t clockid, struct sigevent *evp, timer_t *timerid);
请告诉我版本 2 和版本 3 有什么区别?
另外,鉴于 3 个有效,版本 1 如何编译?
显然,timer_create的第三个参数在 v1 和 v3 中是不同的,但它们都编译了。
此代码失败:(但编译(
main():
timer_t *tidlist;
tidlist = calloc(2, sizeof(timer_t));
initialize_timer(tidlist[0], 2);
int initialize_timer(timer_t *tid, int seconds){
if (timer_create(CLOCK_REALTIME, &sev, tid) == -1) <----- seg fault here. but it should not even compile because the working version accepts the **timer_t as argument.
这甚至不编译:(即使它是完全相同的东西是有效的(
main():
timer_t *tidlist;
tidlist = calloc(2, sizeof(timer_t));
initialize_timer(tidlist[0], 2);//initilize timer for producer
initialize_timer(timer_t *tid, int seconds):
if (timer_create(CLOCK_REALTIME, &sev, &tid) == -1) <------- type error for 3 arg: incompatible pointer type.
此代码有效:
main():
timer_t *tidlist;
tidlist = calloc(2, sizeof(timer_t));
initialize_timer(tidlist, 2);//initilize timer for producer
int initialize_timer(timer_t *tidlist, int seconds){
if (timer_create(CLOCK_REALTIME, &sev, &tidlist[0]) == -1)
提前谢谢。
-
请告诉我版本 2 和版本 3 有什么区别?
版本 2 有以下行和定义:
initialize_timer(timer_t *tid, int seconds): if (timer_create(CLOCK_REALTIME, &sev, &tid) == -1)
tid
是一个timer_t *
,所以&tid
是一个timer_t **
,这与timer_create()
的期望不相容。版本 3 具有:
int initialize_timer(timer_t *tidlist, int seconds){ if (timer_create(CLOCK_REALTIME, &sev, &tidlist[0]) == -1)
tidlist
是一个timer_t *
,所以&tidlist[0]
也是一个timer_t *
,这是意料之中的,也是有效的。&tidlist[0]
相当于tidlist
。 -
另外,鉴于 3 个有效,版本 1 如何编译?
版本 1 不会在没有警告的情况下进行编译。 注意他们。 你有以下代码:
timer_t *tidlist; tidlist = calloc(2, sizeof(timer_t)); initialize_timer(tidlist[0], 2);
tidlist
是timer_t *
,所以tidlist[0]
是timer_t
,这不是initialize_timer
所期望的。