📜  门| GATE CS 2021 |套装2 |问题1(1)

📅  最后修改于: 2023-12-03 15:42:12.602000             🧑  作者: Mango

门 | GATE CS 2021 | 套装 2 | 问题 1

简介

本题目为 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;
}

请回答以下问题:

  1. 运行上述程序会输出什么?
  2. 当程序运行时,如果用户按下 Ctrl + C,会发生什么?
  3. 如果在程序中注释掉 signal(SIGINT, sighandler); 这行代码,再次运行程序,用户按下 Ctrl + C,会发生什么?

并设计至少两个测试用例来验证该程序的正确性。

答案
  1. 运行程序将输出如下内容:
Hello 1
Hello 2
Hello 3
Hello 4
Hello 5
  1. 如果用户在程序运行时按下 Ctrl + C,会触发中断信号(SIGINT)并调用 sighandler 函数进行信号处理。在本例中,sighandler 函数被定义为输出信号编号并换行。因此,程序会输出如下内容:
Hello 1
Signal 2 received.
Hello 2
Hello 3
Hello 4
Hello 5

在输出 Signal 2 received. 之后,程序继续运行直至结束。中断信号的编号为 2,因此输出的信号编号为 2。

  1. 如果在程序中注释掉 signal(SIGINT, sighandler); 这行代码再次运行程序,用户按下 Ctrl + C,程序将接收到中断信号(SIGINT),但是没有任何信号处理函数来处理该信号,因此就会直接退出程序。因此,程序不会输出任何内容。
测试用例
测试用例 1

输入:用户在程序运行时按下 Ctrl + C

输出:

Hello 1
Signal 2 received.
Hello 2
Hello 3
Hello 4
Hello 5

该测试用例验证了程序能够正确处理中断信号。

测试用例 2

输入:程序启动后,不进行任何操作,等待程序运行结束。

输出:

Hello 1
Hello 2
Hello 3
Hello 4
Hello 5

该测试用例验证了程序能够正确运行,不会出现异常。