C 库 - raise() 函数



C 库的 raise(sig) 函数会导致生成信号 sigsig 参数与 SIG 宏兼容。

两种类型的信号处理:

  • 测试信号处理:在这种信号处理中,我们使用 raise() 来检查信号处理程序是否对特定信号正确响应。
  • 自定义信号处理:如果用户希望使用 signal() 函数设置自定义信号处理,那么我们可以使用 raise() 函数显式调用处理程序。

语法

以下是 C 库 raise() 函数的语法:

int raise(int sig)

参数

此函数仅接受一个信号参数:

  • sig - 这是要发送的信号编号。以下是一些重要的标准信号常量:

序号 宏 & 信号
1

SIGABRT

(信号中止) 由 abort 函数发起的异常终止。

2

SIGFPE

(信号浮点异常) 错误的算术运算,例如零除或导致溢出的运算(不一定与浮点运算相关)。

3

SIGILL

(信号非法指令) 无效的函数映像,例如非法指令。这通常是由于代码损坏或尝试执行数据造成的。

4

SIGINT

(信号中断) 交互式注意信号。通常由应用程序用户生成。

5

SIGSEGV

(信号段错误) 无效的存储器访问 - 当程序尝试读取或写入超出分配给它的内存时。

6

SIGTERM

(信号终止) 发送到程序的终止请求。

返回值

如果函数成功,则返回零;否则返回非零值。

示例 1

在此示例中,我们使用 C 库 raise() 函数来演示其用法。

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

void signal_catchfunc(int);

int main () {
   int ret;

   ret = signal(SIGINT, signal_catchfunc);

   if( ret == SIG_ERR) {
      printf("Error: unable to set signal handler.\n");
      exit(0);
   }
   printf("Going to raise a signal\n");
   ret = raise(SIGINT);
   
   if( ret !=0 ) {
      printf("Error: unable to raise SIGINT signal.\n");
      exit(0);
   }

   printf("Exiting...\n");
   return(0);
}

void signal_catchfunc(int signal) {
   printf("!! signal caught !!\n");
}

输出

以上代码产生以下结果:

Going to raise a signal
!! signal caught !!
Exiting...

示例 2

在此示例中,我们使用 signal() 和 raise() 函数说明了信号接收方和发送方。

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

void handler(int sig) {
   // Signal receiver
   printf("Signal received : %d\n", sig);
}

int main() {
   signal(SIGILL, handler);
   // Signal sender
   printf("Signal Sended : %d\n", SIGILL);
   raise(SIGILL);
   return 0;
}

输出

执行以上代码后,我们将获得以下结果:

Signal Sended : 4
Signal received : 4
广告