gpt4 book ai didi

c - 为什么我不能调用函数信号返回的函数(信号处理程序)?

转载 作者:太空宇宙 更新时间:2023-11-04 02:22:48 24 4
gpt4 key购买 nike

弄清楚signal函数的签名后,我修改了https://en.cppreference.com/w/c/program/signal给出的例子。 .

但为什么我不能调用 signal 返回的函数(信号处理程序),而是直接调用它?


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

signal函数返回一个指向函数的指针,即void (*)(int)

Return value

Previous signal handler on success or SIG_ERR on failure (setting a signal handler can be disabled on some implementations).

#include <signal.h>
#include <stdio.h>

void signal_handler(int signal)
{
printf("hahahah\n");
}

int main(void)
{
void (*f1)(int);
f1 = signal(SIGINT, signal_handler);
f1(3); //Get signal SIGSEGV and failed
// signal_handler(3); //OK
raise(SIGINT);

}

我知道这可能看起来像一个毫无意义的问题,但重点是,f1 指向 signal_handler,所以调用 f1(3)就像调用signal_handler(3)一样,我不明白为什么后者可以但前者不行,我认为这两个调用函数语句之间不应该有“技巧” .

最佳答案

至少有 3 个 signal() 可以返回的值不是指向实际函数的指针:

  1. SIG_DFL — 通常是 ((void (*)(int))0)
  2. SIG_IGN — 通常是 ((void (*)(int))1)
  3. SIG_ERR — 通常是 ((void (*)(int))-1)

程序启动时,信号处于SIG_IGNSIG_DFL 模式;您随后可以将它们设置为另一个值。

当你调用 f1 = signal(SIGINT, signal_handler); 时,你会得到 SIG_DFLSIG_IGN 之一——而且两者都不是是指向可调用函数的指针(即使它们的类型是指向正确类型的函数的指针)。

关于c - 为什么我不能调用函数信号返回的函数(信号处理程序)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55390218/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com