我試圖讓一個突然退出處理程序,允許程序在最終退出之前釋放內存。雖然我的代碼部分工作,但不能按預期工作。當我執行killall a.out
來終止linux 命令行中正在運行的程序時,我期望它能夠執行end_app()
函數。如何讓這個後臺運行代碼只用一個kill命令終止?
下面是當我輸入引號內的命令(不包括引號)時,在控制檯發生的事情的屏幕截圖。爲了簡單起見,我故意將實際提示名稱更改爲linux-prompt#
。執行「killall a.out的」第二次,而不是第三次後:
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#
實際上,我是期待一個「不殺進程的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;
}
什麼可能我是做錯了什麼?
UPDATE
爲了澄清,我在做什麼用gcc編譯是上面的程序,那麼該文件的a.out在當前文件夾中的實際程序本身產生的。
我在後臺通過鍵入./a.out &
的main()
函數然後執行永遠按預期運行它的一個實例。
當我執行killall a.out
end_app()
函數應該只執行一次,然後程序從內存中刪除,然後正式終止。我遇到的問題是我必須執行killall a.out
兩次才結束程序而不是killall a.out
一次。
我試圖讓它只執行killall a.out
一次就會終止程序,類似於我在前面的段落中所描述的。
你的問題有點困惑。它的答案可能很簡單,寫它的難度在於理解你的問題。我會建議儘量讓你的問題更清楚。 – peterh
我更新了我的問題,以反映應該發生的事情以及採取哪些措施來實現它。 – Mike
退出操作系統後,將回收所有內存。你並不需要這樣做。 – Keith