如何重新制作已停止的流程?为什么停止进程在重新生成父母后才会终止?
更准确地说,假设我有这样的代码
#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>
然后子进程停止(T
中的ps xaf
状态)并且父进程休眠。传递30秒后,父进程从睡眠状态返回并终止(当它到达main
的末尾时),但子进程而不是在停止状态下重新成为init
的父级才终止。我在ps xaf
中没有看到它,如果运行lastcomm
,我看到了这个输出:
a.out F X equi pts/5 0.00 secs Wed Mar 16 17:44
为什么这种情况会在重新育儿后停止进程而死?是否有可能在linux中重新停止进程?
答案 0 :(得分:3)
来自http://www.gnu.org/software/libc/manual/html_node/Job-Control-Signals.html
孤立进程组中的进程时(请参阅孤立进程 组)接收SIGTSTP,SIGTTIN或SIGTTOU信号,但不接收 处理它,过程不会停止。停止这个过程会 可能不是很有用,因为没有shell程序会 注意它停止并允许用户继续它。反而会发生什么 取决于您使用的操作系统。有些系统可能会这样做 没有;其他人可能会提供另一个信号,例如SIGKILL或 SIGHUP。在GNU / Hurd系统上,该过程随SIGKILL而死;这个 避免了许多停止,孤立的进程的问题 系统。