如何让我的linux服务触发我的信号

how can i make my linux service trigger my signal?

本文关键字:我的 信号 服务 linux      更新时间:2023-10-16

我用C++制作了我的第一个linux服务。

pid_t pid, sid;
pid = fork();
if (pid < 0) {
    exit(EXIT_FAILURE);
}
if (pid>0) {
    exit(EXIT_SUCCESS);
}
umask(0);
sid = setsid();
if (sid < 0) {
    exit(EXIT_FAILURE);
}
if ((chdir("/")) < 0) {
    exit(EXIT_FAILURE);
}
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
while (1) {
    ????????
    //sleep(10);
}
exit(EXIT_SUCCESS);

它会做的是等待我的信号,当它收到信号时,它会做一些任务,然后再次等待我的下一个信号。

我会以某种方式从运行在同一台机器上的c++应用程序中发送信号(或其他什么)。看起来像是两个应用程序之间的信号机制。但在这种情况下,一个是linux服务,我不知道该服务如何等待我的信号。

我怎样才能做到这一点?我的备选方案是什么?

谢谢。

注意:"信号"一词引起混淆。从技术上讲,我不打算用这个词。我只是想说,我需要从我的cpp应用程序中与我的linux服务对话。

注意2:使用signal是没有用的,因为在它的处理程序中,几乎做任何事情都是不安全的,而我需要做很多事情。(我不知道我是否可以启动一个线程,至少!)

这里是一个处理SIGHUP和SIGTERM的处理程序的例子,您的程序可以使用kill -9 processidkill -HUP processid发送这些信号当然还有一些其他信号可以用于此目的检查man signal

void handler (int signal_number){
    //action
    exit(1);
}

在主程序中

struct sigaction act;
struct sigaction act2;
memset (&act, 0, sizeof (act));
memset (&act2, 0, sizeof (act2));
act.sa_handler = handler;
act2.sa_handler = handler;
if (sigaction (SIGHUP, &act, NULL) < 0) {
    perror ("sigaction");
}
if (sigaction (SIGTERM, &act, NULL) < 0) {
    perror ("sigaction");
}
//wait here for ever or do something.

终于找到了合适的关键词来搜索我需要知道的内容。以下是不同进程之间通信的替代方式:

http://www.tldp.org/LDP/lpg/node7.html