关于Linux应用程序中信号函数sigpending使用的一点疑惑

HW_Coder0501 2016-09-13 08:59:40
以下程序是APUE第三版中第10章(276页)的一个例程,关于这个例程有两点不理解的地方,我已经用红体字标识在下面,疑问也写在了对应程序段的上面,小弟新学,弄不懂这两个疑问,请大神们帮我解答一下,先谢过了。。
#include "apue.h"

static void sig_quit(int);

int main(void)
{
sigset_t newmask, oldmask, pendmask;

/*第一点疑惑:signal信号的原型:void (*signal(int signo, void (*func)(int) ))(int) ,但下面的signal函数中的sig_quit并没有声明为函数指针 */
if (signal(SIGQUIT, sig_quit) == SIG_ERR)
err_sys("can't catch SIGQUIT");


sigemptyset(&newmask);
sigaddset(&newmask, SIGQUIT);
if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) <0)
err_sys("SIG_BLOCK error");

sleep(5);

if (sigpending(&pendmask) < 0)
err_sys("sigpending error");
if (sigismember(&pendmask, SIGQUIT))
printf("\nSIGQUIT pending\n");

if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
err_sys("SIG_SETMASK error");
printf("SIGQUIT unblocked\n");

sleep(5);
exit(0);
}

static void sig_quit(int signo)
{
printf("catch SIGQUIT\n");
if (signal(SIGQUIT,SIG_DEL)==SIG_ERR)
err_sys("can't reset SIGQUIT");
}

/* 第二个疑惑:函数sig_quit()中的内容是怎么输出的,并且为什么该函数中的printf语句先执行?*/
编译运行此程序: ./a.out
^\ 产生一次信号
SIGQUIT pending
caught SIGQUIT
SIGQUIT unblocked
...全文
193 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hijack00 2016-09-13
  • 打赏
  • 举报
回复
函数指针与函数名的关系可以类比指针与数组名的关系。 数组名可以被编译器转化为指针,同理,函数名也可以被编译器转化为具有相同函数签名的函数指针
  • 打赏
  • 举报
回复
1、函数指针就是指向的函数的首地址(即其值就是函数的首地址),函数名的值也是函数首地址。 2、顺序执行。
hijack00 2016-09-13
  • 打赏
  • 举报
回复
引用 4 楼 hhhlizhao 的回复:
[quote=引用 2 楼 hijack00 的回复:] 函数指针与函数名的关系可以类比指针与数组名的关系。 数组名可以被编译器转化为指针,同理,函数名也可以被编译器转化为具有相同函数签名的函数指针
那不应该声明一下这是个函数指针吗?像下面这样: static void (*sig_quit)(int); [/quote] 建议你还是先看看C语言语法方面的书,把基本概念搞清楚。什么是声明,什么是定义
  • 打赏
  • 举报
回复
引用 4 楼 hhhlizhao 的回复:
[quote=引用 2 楼 hijack00 的回复:] 函数指针与函数名的关系可以类比指针与数组名的关系。 数组名可以被编译器转化为指针,同理,函数名也可以被编译器转化为具有相同函数签名的函数指针
那不应该声明一下这是个函数指针吗?像下面这样: static void (*sig_quit)(int); [/quote] 多看书
HW_Coder0501 2016-09-13
  • 打赏
  • 举报
回复
引用 2 楼 hijack00 的回复:
函数指针与函数名的关系可以类比指针与数组名的关系。 数组名可以被编译器转化为指针,同理,函数名也可以被编译器转化为具有相同函数签名的函数指针
那不应该声明一下这是个函数指针吗?像下面这样: static void (*sig_quit)(int);
HW_Coder0501 2016-09-13
  • 打赏
  • 举报
回复
引用 1 楼 q3733353520 的回复:
1、函数指针就是指向的函数的首地址(即其值就是函数的首地址),函数名的值也是函数首地址。 2、顺序执行。
那程序第二行中static void sig_quit(int);应该写为static void (*sig_quit)(int);以声明这是一个函数指针才对啊。

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧