【问题标题】:how to make this background running code terminate with just one kill command?如何让这个后台运行的代码只用一个 kill 命令终止?
【发布时间】:2016-01-15 20:43:29
【问题描述】:

我正在尝试制作一个突然退出处理程序,允许程序在最终退出之前释放内存。虽然我的代码部分有效,但它并没有按预期工作。我期望它做的是在我执行killall a.out 时运行end_app() 函数来杀死linux 中正在运行的程序 命令行。

下面是我在控制台中输入带引号的命令(不包括引号)时发生的屏幕截图。为简单起见,我特意将真实提示名改为linux-prompt#

linux-prompt# "./a.out &"
[1] 6071
linux-prompt# Started
"ps -A | grep a.out"
6071 pts/2    00:00:11 a.out
linux-prompt# "killall a.out"
linux-prompt# Ending
Ended
"ps -A | grep a.out"
6071 pts/2    00:00:30 a.out
linux-prompt# "killall a.out"
linux-prompt# "ps -A | grep a.out"
[1]+  Terminated              ./a.out
linux-prompt# "killall a.out"
a.out: no process killed
linux-prompt# "ps -A | grep a.out"
linux-prompt#

在第二次而不是第三次执行“killall a.out”之后,我实际上期待“a.out:没有进程被杀死”。

这是我的代码:

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

    static char*x=NULL;

    void end_app(int s){
      printf("Ending\n");
      struct sigaction si;
      si.sa_handler=SIG_DFL;
      si.sa_flags=0;
      sigaction(SIGCHLD,&si,NULL);
      sigaction(SIGTSTP,&si,NULL);
      sigaction(SIGTTOU,&si,NULL);
      sigaction(SIGTTIN,&si,NULL);
      sigaction(SIGSEGV,&si,NULL);
      sigaction(SIGTERM,&si,NULL);
      sigaction(SIGHUP,&si,NULL);
      free(x);
      printf("Ended\n");
    }


int main(){
      struct sigaction s,si;
      si.sa_handler=SIG_IGN;
      si.sa_flags=0;
      s.sa_handler=end_app;
      s.sa_flags=0;
      sigaction(SIGCHLD,&si,NULL);
      sigaction(SIGTSTP,&si,NULL);
      sigaction(SIGTTOU,&si,NULL);
      sigaction(SIGTTIN,&si,NULL);
      if (sigaction(SIGSEGV,&s,NULL)==-1){printf("Cant trap signal!\n");return 1;}
      if (sigaction(SIGTERM,&s,NULL)==-1){printf("Cant trap signal!\n");return 1;}
      if (sigaction(SIGHUP,&s,NULL)==-1){printf("Cant trap signal!\n");return 1;}
      unsigned long n=10000005;
      x=calloc(1,n);
      printf("Started\n");
      while(1){
        //do random daemon work here
      }
      return 0;
    }

我做错了什么?

更新

为了澄清,我正在做的是使用 gcc 编译上述程序,然后在当前文件夹中创建文件 a.out 作为实际程序本身。

我通过输入./a.out &amp;在后台运行它的一个实例

main() 函数然后按预期永远执行。

当我执行killall a.out 时,end_app() 函数应该只执行一次,然后程序从内存中删除,然后正式终止。我遇到的问题是我必须执行两次killall a.out 才能结束程序,而不是只执行一次killall a.out

我正在尝试让killall a.out 只执行一次就会终止程序,类似于我在上一段中描述的内容。

【问题讨论】:

  • 你的问题有点混乱。它的答案可能很简单,写它的难点在于理解你的问题。我建议尽量让你的问题更清楚。
  • 我更新了我的问题,以反映应该发生的事情以及要采取哪些步骤来实现它。
  • 一旦你退出操作系统回收所有内存。你真的不需要这样做。
  • 我不能相信。我需要释放内存,但我想通了。我必须在我的程序中设置一个由信号处理程序设置的静态变量,然后我必须从我的程序中检测它。

标签: c linux signals kill terminate


【解决方案1】:

您可以使用 pkill 命令杀死所有进程。

例子:-

您有 5 个 a.out 在后台运行。

$ pkill -9 a.out

使用pkill -9 a.out,这将杀死所有a.out进程。

【讨论】:

  • 我已经知道如何从 linux 命令行执行杀死程序。我想做的事情是让我的程序正确执行信号处理程序,然后在用户执行 kill 命令时完全终止。
猜你喜欢
  • 2011-04-23
  • 2014-03-08
  • 2015-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多