在 Linux 中,信号是操作系统用于通知进程发生某种事件的一种机制
信号类型:Linux 支持多种信号,例如:
信号处理函数:C++ 中可以使用 signal()
或 sigaction()
函数来处理信号。signal()
函数用于设置信号处理函数,而 sigaction()
函数提供了更强大的信号处理功能。
使用 signal()
函数的示例:
#include <iostream>
#include <csignal>
#include <unistd.h>
void signalHandler(int sig) {
std::cout << "Signal " << sig << " received, terminating process." << std::endl;
exit(0);
}
int main() {
signal(SIGINT, signalHandler);
while (true) {
std::cout << "Running..." << std::endl;
sleep(1);
}
return 0;
}
使用 sigaction()
函数的示例:
#include <iostream>
#include <csignal>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
void signalHandler(int sig) {
std::cout << "Signal " << sig << " received, terminating process." << std::endl;
pid_t pid = getpid();
kill(pid, SIGTERM);
}
int main() {
struct sigaction sa;
sa.sa_handler = signalHandler;
sa.sa_flags = 0;
sigemptyset(&sa.sa_mask);
if (sigaction(SIGINT, &sa, NULL) == -1) {
std::cerr << "Error setting signal handler." << std::endl;
return 1;
}
while (true) {
std::cout << "Running..." << std::endl;
sleep(1);
}
return 0;
}
信号传递:信号在进程间传递时,会沿着进程树向上传递,直到被某个进程处理。当一个进程收到信号时,如果没有设置处理函数,信号将被传递给其父进程。如果父进程也没有设置处理函数,信号将继续向上传递,直到被根进程(通常是 init 进程)处理。根进程会忽略大多数信号,并将它们传递给子进程。
信号集:Linux 提供了一组信号集,用于方便地操作多个信号。例如,可以使用 sigemptyset()
、sigfillset()
、sigaddset()
和 sigdelset()
等函数来操作信号集。此外,可以使用 sigprocmask()
函数来设置、修改或清除当前进程的信号掩码。
信号排序:当进程收到多个信号时,它们的顺序是不确定的。为了确保信号按照特定的顺序被处理,可以在信号处理函数中使用信号集对信号进行排序。
信号同步:信号处理函数可能会被多个线程调用,因此需要确保在信号处理函数中使用互斥锁或其他同步机制来避免竞态条件。
总之,C++ 在 Linux 中的信号处理允许程序对操作系统发出的信号做出响应,从而实现更丰富的功能和更好的用户体验。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。