【发布时间】: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 &在后台运行它的一个实例
main() 函数然后按预期永远执行。
当我执行killall a.out 时,end_app() 函数应该只执行一次,然后程序从内存中删除,然后正式终止。我遇到的问题是我必须执行两次killall a.out 才能结束程序,而不是只执行一次killall a.out。
我正在尝试让killall a.out 只执行一次就会终止程序,类似于我在上一段中描述的内容。
【问题讨论】:
-
你的问题有点混乱。它的答案可能很简单,写它的难点在于理解你的问题。我建议尽量让你的问题更清楚。
-
我更新了我的问题,以反映应该发生的事情以及要采取哪些步骤来实现它。
-
一旦你退出操作系统回收所有内存。你真的不需要这样做。
-
我不能相信。我需要释放内存,但我想通了。我必须在我的程序中设置一个由信号处理程序设置的静态变量,然后我必须从我的程序中检测它。
标签: c linux signals kill terminate