📜  进程间通信-信号(1)

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

进程间通信-信号

在Linux操作系统中,进程间通信是非常常见的操作。在进程间通信中,信号是一种非常广泛使用的方式,可以让一个进程发送一个信号给另一个进程。

什么是信号

信号是一种由操作系统发送给进程的中断请求。在Linux系统中,有很多种不同的信号,每种信号都有一个唯一的编号。当一个进程接收到一个信号,它会停止当前正在执行的工作,并根据信号的类型来执行相应的操作。

发送信号

在Linux系统中,有多种方式可以发送信号,例如使用kill命令或者使用信号系统调用函数如kill、raise、killpg、alarm等。

以下是使用kill命令发送信号的示例:

$ kill -9 1234

上面的命令将发送编号为1234的进程一个SIGKILL信号,这会强制终止该进程。

接收信号

当一个进程收到一个信号时,可以使用信号处理函数来处理这个信号。在C语言中,可以使用signal函数来注册一个信号处理函数。

以下是注册一个SIGINT信号处理函数的示例:

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

void signal_handler(int signal) {
  if (signal == SIGINT) {
    printf("Received SIGINT signal\n");
    exit(0);
  }
}

int main() {
  signal(SIGINT, signal_handler);
  while (1) {
    // 等待信号
  }
  return 0;
}

上面的示例中,我们使用signal函数注册了一个信号处理函数signal_handler,它被注册成了SIGINT信号的处理函数。当进程收到SIGINT信号时,会执行signal_handler函数,该函数会输出一条消息并退出程序。

捕获信号

在Linux系统中,有一些信号是不能被忽略的,比如SIGKILL和SIGSTOP。但是,大部分信号都可以被进程忽略或者自定义处理。在C语言中,我们可以使用sigaction函数来捕获信号。

以下是使用sigaction函数捕获SIGINT信号的示例:

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

void signal_handler(int signal) {
  if (signal == SIGINT) {
    printf("Received SIGINT signal\n");
    exit(0);
  }
}

int main() {
  struct sigaction sa;
  sa.sa_handler = signal_handler;
  sigemptyset(&sa.sa_mask);
  sa.sa_flags = 0;
  sigaction(SIGINT, &sa, NULL);
  while (1) {
    // 等待信号
  }
  return 0;
}

上面的示例中,我们使用sigaction函数注册了一个SIGINT信号处理函数signal_handler,并捕获了该信号。当进程收到SIGINT信号时,会执行signal_handler函数,该函数会输出一条消息并退出程序。

总结

信号是进程间通信的一种非常常见的方式,在Linux系统中有多种方式可以发送和接收信号,可以使用信号处理函数来处理信号,也可以使用sigaction函数来捕获信号并执行自定义的操作。这里所讲的只是信号的一部分内容,如果想要深入了解信号,请参考Linux系统编程相关的文档和书籍。