VS Code 通过 SSH 连接 Ubuntu 后编写 C 代码:信号处理示例与常见错误
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' 未定义,以及如何解决该问题。希望这篇文章能帮助您更好地理解和运用信号处理技术。
原文地址: https://www.cveoy.top/t/topic/qu13 著作权归作者所有。请勿转载和采集!