2015-10-17 52 views
0

我試圖讓一個突然退出處理程序,允許程序在最終退出之前釋放內存。雖然我的代碼部分工作,但不能按預期工作。當我執行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.outend_app()函數應該只執行一次,然後程序從內存中刪除,然後正式終止。我遇到的問題是我必須執行killall a.out兩次才結束程序而不是killall a.out一次。

我試圖讓它只執行killall a.out一次就會終止程序,類似於我在前面的段落中所描述的。

+0

你的問題有點困惑。它的答案可能很簡單,寫它的難度在於理解你的問題。我會建議儘量讓你的問題更清楚。 – peterh

+0

我更新了我的問題,以反映應該發生的事情以及採取哪些措施來實現它。 – Mike

+0

退出操作系統後,將回收所有內存。你並不需要這樣做。 – Keith

回答

0

您可以使用pkill命令殺死所有進程。

示例: -

您有5個a.out在後臺運行。

$ pkill的-9的a.out

使用pkill的-9的a.out,這將殺死所有的a.out的過程。

+0

我已經知道如何從linux命令行執行查殺程序。我想要做的事情是讓我的程序正確執行信號處理程序,然後在用戶執行kill命令時完全終止。 – Mike

相關問題