📅  最后修改于: 2023-12-03 15:42:12.602000             🧑  作者: Mango
本题目为 GATE 计算机科学考试 2021 年套装第二部分第一题,涉及到操作系统中的信号(signal)处理。该题目要求考生分析一个示例代码,解释其输出结果,并且设计一组测试用例来验证程序的正确性。
给定以下示例代码:
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
void sighandler(int signum) {
printf("\nSignal %d received.\n",signum);
}
int main() {
int i;
signal(SIGINT, sighandler);
for (i = 1; i <= 5; i++) {
printf("Hello %d\n", i);
sleep(1);
}
return 0;
}
请回答以下问题:
Ctrl + C
,会发生什么?signal(SIGINT, sighandler);
这行代码,再次运行程序,用户按下 Ctrl + C
,会发生什么?并设计至少两个测试用例来验证该程序的正确性。
Hello 1
Hello 2
Hello 3
Hello 4
Hello 5
Ctrl + C
,会触发中断信号(SIGINT
)并调用 sighandler
函数进行信号处理。在本例中,sighandler
函数被定义为输出信号编号并换行。因此,程序会输出如下内容:Hello 1
Signal 2 received.
Hello 2
Hello 3
Hello 4
Hello 5
在输出 Signal 2 received.
之后,程序继续运行直至结束。中断信号的编号为 2,因此输出的信号编号为 2。
signal(SIGINT, sighandler);
这行代码再次运行程序,用户按下 Ctrl + C
,程序将接收到中断信号(SIGINT
),但是没有任何信号处理函数来处理该信号,因此就会直接退出程序。因此,程序不会输出任何内容。输入:用户在程序运行时按下 Ctrl + C
输出:
Hello 1
Signal 2 received.
Hello 2
Hello 3
Hello 4
Hello 5
该测试用例验证了程序能够正确处理中断信号。
输入:程序启动后,不进行任何操作,等待程序运行结束。
输出:
Hello 1
Hello 2
Hello 3
Hello 4
Hello 5
该测试用例验证了程序能够正确运行,不会出现异常。