我需要初始化一个Posix计时器,但它确实可以工作,但是有点奇迹。我不明白工作和代码之间的区别给我分段错误。

这是create_timer函数的 header :

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具有以下行和定义:
    initialize_timer(timer_t *tid, int seconds):
        if (timer_create(CLOCK_REALTIME, &sev, &tid) == -1)
    
    tidtimer_t *,因此&tidtimer_t **,并且与timer_create()期望的内容不兼容。

    版本3具有:
    int initialize_timer(timer_t *tidlist, int seconds){
        if (timer_create(CLOCK_REALTIME, &sev, &tidlist[0]) == -1)
    
    tidlisttimer_t *,因此&tidlist[0]也是timer_t *,可以预期并且可以使用。 &tidlist[0]tidlist等效。


  • 没有警告,版本1不会编译。注意他们。您有以下代码:
    timer_t *tidlist;
    tidlist = calloc(2, sizeof(timer_t));
    initialize_timer(tidlist[0], 2);
    
    tidlisttimer_t *,因此tidlist[0]timer_t,这不是initialize_timer期望的。
  • 10-06 01:44