你的子进程正在被杀死。 僵尸进程, 也称为defunct进程(已死进程);zombies已经死了! 僵尸进程只是进程表中的条目,它没有任何代码或内存。
当一个进程死亡时(通过调用_exit
或被信号杀死),它必须由其父进程回收。除了进程表中的条目之外,进程使用的所有资源都会消失。父进程必须调用wait
或waitpid
。一旦父进程已被通知子进程的死亡,并有机会读取子进程的退出状态,子进程在进程表中的条目也会消失:僵尸进程被回收。
如果您永远不想收到子进程的死亡通知,请忽略SIGCHLD
信号;这告诉内核您不想了解子进程的命运,僵尸进程将自动被回收。
signal(SIGCHLD, SIG_IGN)
如果你只想在特定情况下被通知子进程的死亡,请使用带有
SA_NOCLDWAIT
标志的
sigaction
函数进行调用。当一个子进程死亡时,如果父进程正在执行
wait
系列函数中的任何一个,则会通知它子进程的死亡,并告知其退出状态;否则子进程的退出状态将被丢弃。
struct sigaction sa;
sa.sa_handler = &my_sigchld_handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_NOCLDWAIT;
sigaction(SIGCHLD, &sa, NULL);
关于输出,除非您已经明确地重定向了它们(使用
close
和
open
、
dup
或其他可能性),否则您的子进程会写入与父进程相同的位置。您的子进程可能正在将诊断消息打印到标准错误输出(毕竟这就是其用途)。
./spawnbot >logging.txt 2>&1
此外,由于您似乎想要将子进程与终端分离,因此您可能希望确保它们不会在您杀死终端时接收到SIGHUP。因此,请使用nohup
:
nohup ./spawnbot >logging.txt 2>&1 &
disown