2016-03-16 25 views
2

停止過程的再養育如何發生?爲什麼停止的過程在重新養育之後才終止?再養育停止過程

更確切地說,假設我有一個這樣

#include <sys/types.h> 
#include <sys/wait.h> 
#include <unistd.h> 
#include <sys/user.h> 
#include <sys/syscall.h> 
#include <stdio.h> 


int main(void) { 
    pid_t child; 

    child = fork(); 

    if (child == 0) { 
     int t = 0; 
     while (true) { 
      printf("%d. I'm %d, my parent is %d\n", t++, getpid(), getppid()); 
      sleep(1); 
     } 
    } else { 
     printf("I'm the parent. My pid is %d\n", getpid()); 
     printf("Starting to wait for 30 seconds\n"); 
     sleep(30); 
     printf("Done waiting, aborting\n"); 
    } 
} 

代碼當我運行這段代碼的子進程作品和父進程只是睡覺。 30秒後,父進程終止,子進程現在成爲init的子進程,並繼續運行。一切正常。

但是,如果我運行此代碼,並在它的前30秒的執行我也運行

kill -SIGSTOP <child_pid>

那麼孩子過程停止(在ps xafT狀態)和父進程睡眠。過了30秒後,父進程從睡眠中返回並剛剛終止(因爲它已到達main的末尾),但是子進程而不是重新生成到處於停止狀態的init才終止。我沒有看到它在ps xaf,如果運行lastcomm我看到這樣的輸出:

a.out    F X equi  pts/5  0.00 secs Wed Mar 16 17:44 

這究竟是爲什麼已停止進程重新養育後死亡?是否有可能在Linux中重新停止進程?

+0

你爲什麼要這麼做? – nzc

+1

@nzc有'criu'這樣的東西(參見criu.org或https://github.com/xemul/criu)我想在'criu restore'中添加'--leave-stopped'功能(目前只有可用'criu dump') – PepeHands

+0

我想你可能會得到更好的結果,如果你在你的問題中包含一些這些細節。我認爲(但我不確定)問題的一部分在於,您可能正在使用工作控制信號,而這些信號並非打算使用。包括爲什麼要使用它們的背景可能會幫助確實知道的人解釋爲什麼並且可能會提出正確的方法。 – nzc

回答

1

http://www.gnu.org/software/libc/manual/html_node/Job-Control-Signals.html

當孤立進程組中的處理(參照孤立進程 組)接收SIGTSTP,SIGTTIN或SIGTTOU信號並且不 處理它,該過程不停止。停止進程將 可能不是非常有用,因爲沒有shell程序,將 通知它停止並允許用戶繼續它。取而代之的是 取決於您正在使用的操作系統。一些系統可能沒有做 ;其他人可能會傳遞另一個信號,如SIGKILL或SIGHUP。在GNU/Hurd系統上,該進程與SIGKILL一起死亡;這個 避免了許多停止的問題,孤立的進程圍繞在系統的 。

參見:What's the difference between SIGSTOP and SIGTSTP?

+0

其實我不明白'SIGTSTP','SIGTTIN'或'SIGTTOU'怎麼會出現在這裏。在你提供的文件中寫道:「當一個進程組成爲一個孤兒時,它的進程發送一個SIGHUP信號」。這個信號是否會導致我的孩子程序被終止?如果是的話,爲什麼這個信號不會終止我的程序,以防止它沒有停止? – PepeHands

+1

我認爲這裏的真正原因是,「停止」是一個只有當進程具有「作業控制」時纔有意義的狀態,因爲之後它可以重新啓動。我認爲當這個過程失去了工作控制時,系統會發送一個SIGHUP,否則它會永遠停止。看到最後一行「......這可以避免許多停止,孤立進程躺在系統周圍的問題。」 – nzc

+0

此外,重新閱讀您的評論,當您的過程沒有停止時,沒有發送「SIGHUP」。發送SIGHUP是因爲您的進程在成爲孤立進程時被停止。 – nzc