停止過程的再養育如何發生?爲什麼停止的過程在重新養育之後才終止?再養育停止過程
更確切地說,假設我有一個這樣
#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 xaf
T
狀態)和父進程睡眠。過了30秒後,父進程從睡眠中返回並剛剛終止(因爲它已到達main
的末尾),但是子進程而不是重新生成到處於停止狀態的init
才終止。我沒有看到它在ps xaf
,如果運行lastcomm
我看到這樣的輸出:
a.out F X equi pts/5 0.00 secs Wed Mar 16 17:44
這究竟是爲什麼已停止進程重新養育後死亡?是否有可能在Linux中重新停止進程?
你爲什麼要這麼做? – nzc
@nzc有'criu'這樣的東西(參見criu.org或https://github.com/xemul/criu)我想在'criu restore'中添加'--leave-stopped'功能(目前只有可用'criu dump') – PepeHands
我想你可能會得到更好的結果,如果你在你的問題中包含一些這些細節。我認爲(但我不確定)問題的一部分在於,您可能正在使用工作控制信號,而這些信號並非打算使用。包括爲什麼要使用它們的背景可能會幫助確實知道的人解釋爲什麼並且可能會提出正確的方法。 – nzc