VS Code 通过 SSH 连接 Ubuntu 后编写 C 代码:信号处理示例与常见错误

本文将展示一段在 VS Code 中通过 SSH 连接到 Ubuntu 服务器后,编写用于演示信号处理的 C 代码,并解释一些常见错误,例如未定义标识符 'SIG_BLOCK' 的解决方法。

代码示例

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <fcntl.h>
#include <signal.h>

// 信号响应函数
void f(int sig)
{
    if (sig == SIGINT)
    {
        for (int i = 0; i < 10; i++)
        {
            fprintf(stderr, "%d", i);
            usleep(500 * 1000);
        }
    }

    if (sig == SIGHUP)
    {
        for (int i = 0; i < 26; i++)
        {
            fprintf(stderr, "%c", 'A' + i);
            usleep(500 * 1000);
        }
    }

    if (sig == SIGILL)
        printf("收到 SIGILL\n");

    if (sig == SIGRTMAX)
        printf("收到 SIGRTMAX\n");
}

int main(int argc, char const *argv[])
{
    printf("我是 %d, 快给我发信号\n", getpid());

    // 捕获信号
    signal(SIGHUP, f);
    signal(SIGILL, f);
    signal(SIGRTMAX, f);

    // 忽略信号
    signal(SIGINT, SIG_IGN);

    // 延迟响应(阻塞)信号 SIGILL/SIGRTMAX
    sigset_t sigs;
    sigemptyset(&sigs); // 清空信号集合
    sigaddset(&sigs, SIGILL); // 将 SIGILL 加入信号集合
    sigaddset(&sigs, SIGRTMAX); // 将 SIGRTMAX 加入信号集合
    sigprocmask(SIG_BLOCK, &sigs, NULL); // 阻塞信号集合中的所有信号

    sleep(10);
    sigprocmask(SIG_UNBLOCK, &sigs, NULL); // 解除阻塞信号集合中的所有信号

    pause();
    return 0;
}

常见错误与解决方法

未定义标识符 'SIG_BLOCK'

该错误通常是由于缺少头文件 <signal.h> 导致的。请确保在代码开头添加以下代码:

#include <signal.h>

如果添加了头文件后仍然出现相同的错误,请检查编译器是否支持该标识符。有些编译器可能不支持特定的信号处理函数。您可以尝试使用其他方法来实现相同的功能,或者尝试在其他编译器上编译代码。

总结

本文通过一个示例展示了在 VS Code 通过 SSH 连接到 Ubuntu 服务器后,编写 C 代码实现信号处理的基本操作,并解释了常见的错误 'SIG_BLOCK' 未定义,以及如何解决该问题。希望这篇文章能帮助您更好地理解和运用信号处理技术。

VS Code 通过 SSH 连接 Ubuntu 后编写 C 代码:信号处理示例与常见错误

原文地址: https://www.cveoy.top/t/topic/qu13 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录