if (signal(SIGTSTP,sig_handler) == SIG_ERR)

姜希成 Linux 下 C 编程 ——... 最后由 姜希成 于2016年11月08日回复

  • 2 回答
  • 1.5k 浏览

有个问题想了半天也没想明白也查过资料还是不明白

根据定义:

void (*signal(int sig, void(*handler)(int))(int)

那么后面的int就是handler的实参了

如果signal返回的是一个handler地址那么就可以执行handler函数了

可是在题目中的if语句中 只有一个signal函数(后面没有函数操作符前面也没有*解引用) 那么signal函数只是返回了一个函数的地址又怎样执行handler函数呢?如果handler函数是在signal函数的内部执行那么signal又为什么要返回指针呢?又怎样与SIG_ERR进行比较呢?

如果signal函数返回后直接执行了handler函数,而handler函数又是无返回类型的,那么就与SIG_ERR类型不匹配了,那么又怎样和SIG_ERR进行比较呢?

如果signal函数先与SIG_ERR进行比较在执行handler函数,又该怎样实现呢?

您在课程中说SIG_ERR是一个指针,课件中是这样写的:(void(*)(int))(-1)我认为这是将-1强制类型转换为函数指针,也就是 -1地址中的函数的指针,这样不会出错吗?如果SIG_ERR是-1地址中的函数的指针,那么它又应该怎样与signal函数的返回值进行比较呢?(还是说当signal出错时,直接将handler指针置为SIG_ERR?)

还有在linux下怎样查找c库中.h文件对应的.c源代码呢?(因为我想更深的了解一下)

由于对c语言的理解不深,才会被这么多问题困扰,还请指教(上网查了半天也没有找到答案)

  • 极客学院_吕布 2016年11月07日 回答 #1楼
  • signal用法很简单,不用那么纠结

    int sig_int(); //My signal handler

        ...

        signal(SIGINT, sig_int);

        ...

    int sig_int()

    {

        signal(SIGINT, sig_int);

        ....

    }

  • 0 评论
  • 姜希成 2016年11月08日 回答 #2楼
  • #1楼  @极客学院_吕布 谢谢,但是既然signal返回的是一个函数指针,那么单单一个函数指针又是怎样执行信号处理函数的呢?

    为什么不写成这种形式:

    (* signal(int ,void (*)()))();

    这样就是执行signal返回的函数了啊

  • 0 评论