在主函数的最开始会初始化一个全部变量 g_i4event 为 0。 本关的编程任务是补全右侧代码片段中两段Begin至End中间的代码,具体要求如下: 在 do _sigaction中分别为信号 SIGUSR1 、 SIGUSR2 注册信号处理函数 funcA 和 funcB ,而后将 g_i4event 置为 1; 完成两个信号处理函数,其中 funcA 中将 g_i4event 置为 2, funcB 中将 g_i4event 置为 3。 注:采用_sa_sigaction和SA_SIGINFO来实现。
时间: 2024-02-18 16:02:04 浏览: 27
下面是代码实现:
```
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
volatile int g_i4event = 0;
void funcA(int signo, siginfo_t *info, void *context)
{
g_i4event = 2;
}
void funcB(int signo, siginfo_t *info, void *context)
{
g_i4event = 3;
}
int main(int argc, char *argv[])
{
struct sigaction act1, act2;
act1.sa_sigaction = funcA;
act1.sa_flags = SA_SIGINFO;
act2.sa_sigaction = funcB;
act2.sa_flags = SA_SIGINFO;
sigaction(SIGUSR1, &act1, NULL); // 为 SIGUSR1 注册信号处理函数 funcA
sigaction(SIGUSR2, &act2, NULL); // 为 SIGUSR2 注册信号处理函数 funcB
g_i4event = 1;
// 以下是测试代码
raise(SIGUSR1);
raise(SIGUSR2);
if (g_i4event == 2) {
printf("funcA is executed.\n");
} else if (g_i4event == 3) {
printf("funcB is executed.\n");
}
return 0;
}
```
在上述代码中,我们使用 sigaction 函数为 SIGUSR1 和 SIGUSR2 分别注册了信号处理函数 funcA 和 funcB,并且在结构体 act1 和 act2 中设置了 SA_SIGINFO 标志,以便在信号处理函数中使用 siginfo_t 和 void* 类型的参数。在 main 函数中,我们将 g_i4event 初始化为 1,并通过调用 raise 函数来模拟收到信号的情况,从而触发信号处理函数的执行。在信号处理函数中,我们将 g_i4event 分别设置为 2 和 3,以便在主函数中进行判断。最终输出的结果应该是 funcA is executed.