在主函数的最开始会初始化一个全部变量 g_i4event 为 0。 本关的编程任务是补全右侧代码片段中两段Begin至End中间的代码,具体要求如下: 在 do _signal中分别为信号 SIGUSR1 、 SIGUSR2 注册信号处理函数 funcA 和 funcB ,而后将 g_i4event 置为 1; 完成两个信号处理函数,其中 funcA 中将 g_i4event 置为 2, funcB 中将 g_i4event 为 3。#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <signal.h> int g_i4event; typedef void (*sighandler_t)(int); /********Begin********/ /*实现funcA和funcB*/ /*********End*********/ int do_signal(void) { /********Begin********/ /*********End*********/ }
时间: 2023-08-22 16:04:54 浏览: 335
下面是代码实现:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
int g_i4event;
typedef void (*sighandler_t)(int);
void funcA(int signum) {
g_i4event = 2;
}
void funcB(int signum) {
g_i4event = 3;
}
int do_signal(void) {
signal(SIGUSR1, funcA);
signal(SIGUSR2, funcB);
g_i4event = 1;
}
需要注意的是,信号处理函数要求是 void 类型,参数是 int 类型的信号编号。在这个问题中,我们需要实现两个信号处理函数 funcA 和 funcB,并在函数 do_signal 中分别为 SIGUSR1 和 SIGUSR2 注册这两个信号处理函数,同时将 g_i4event 置为 1。
相关问题
在主函数的最开始会初始化一个全部变量 g_i4event 为 0。 本关的编程任务是补全右侧代码片段中Begin至End中间的代码,具体要求如下: 执行“touch test. dat ”命令; 检查命令是否执行成功,如果执行成功,则将 g_i4event 设为 1; 执行成功返回 0,执行失败返回 -1。
以下是代码片段的补全:
```
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int g_i4event = 0;
int main()
{
// 执行 touch 命令
int iRet = system("touch test.dat");
// 检查命令是否执行成功
if (iRet == 0) {
g_i4event = 1;
}
// 输出结果
printf("g_i4event = %d\n", g_i4event);
return iRet;
}
```
在这段代码中,使用`system`函数执行了`touch test.dat`命令,通过判断`system`函数的返回值来确定命令是否执行成功。如果命令执行成功,将`g_i4event`变量设为1。最后输出`g_i4event`变量的值并返回`system`函数的返回值。
在主函数的最开始会初始化一个全部变量 g_i4event 为 0 。 本关的编程任务是补全右侧代码片段中两段Begin至End中间的代码,具体要求如下: 在 do _alarm中首先启动 5s 定时器,将 g_i4event 置为 1; 睡眠一秒,然后为信号 SIGALRM 注册信号处理函数 funcalarm ,将 g_i4event 置为 2; 在信号处理函数,将 g_i4event 置为 3。
以下是代码片段的补全:
```
#include <signal.h>
#include <unistd.h>
#include <sys/time.h>
volatile int g_i4event;
void funcalarm(int signo)
{
g_i4event = 3;
}
void do_alarm()
{
g_i4event = 1;
alarm(5);
sleep(1);
signal(SIGALRM, funcalarm);
g_i4event = 2;
}
int main()
{
g_i4event = 0;
do_alarm();
return 0;
}
```
在以上代码中,我们首先定义了一个全局变量 `g_i4event`,并在 `main()` 函数中初始化为 0。接着,在 `do_alarm()` 函数中,我们启动了一个 5 秒的定时器,并将 `g_i4event` 设置为 1。然后,我们睡眠了一秒钟,为信号 `SIGALRM` 注册了信号处理函数 `funcalarm`,并将 `g_i4event` 设置为 2。
最后,在 `funcalarm()` 函数中,我们将 `g_i4event` 设置为 3,表示信号 `SIGALRM` 已经被处理了。
需要注意的是,全局变量 `g_i4event` 是在信号处理函数和主程序中共享的,因此需要使用 `volatile` 关键字来确保变量在不同的上下文中的正确性。