您的子进程正在被杀死。已失效的进程也称为僵尸进程;僵尸死了!僵尸进程只不过是进程表中的一个条目,它没有任何代码或内存。
当一个进程死亡(通过调用_exit
,或被信号杀死)时,它必须由其父进程收割。除了进程表中的条目之外,进程使用的所有资源都消失了。家长必须调用wait
或waitpid
。一旦父进程收到子进程死亡的通知,并且有机会读取子进程的退出状态,进程表中子进程的条目也会消失:僵尸被收割。
如果您不想收到孩子死亡的通知,请忽略该SIGCHLD
信号;这告诉内核你对知道你孩子的命运不感兴趣,僵尸将被自动收割。
signal(SIGCHLD, SIG_IGN)
如果您只想在特定情况下收到您孩子死亡的通知,请sigaction
举旗SA_NOCLDWAIT
打电话。当一个孩子死亡时,如果父母正在执行其中一个wait
家族的功能,它会被告知孩子的死亡,并被告知退出状态;否则孩子的退出状态将被丢弃。
struct sigaction sa;
sa.sa_handler = &my_sigchld_handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_NOCLDWAIT;
sigaction(SIGCHLD, &sa, NULL);
关于输出,您的孩子写到与父母相同的地方,除非您明确重定向他们(使用close
and open
、 ordup
或许多其他可能性)。您的孩子可能正在将诊断消息打印到标准错误(毕竟这就是它的用途)。
./spawnbot >logging.txt 2>&1
此外,由于您似乎想将子代与终端分离,因此您可能希望确保在您终止终端时他们不会收到SIGHUP。所以使用nohup
:
nohup ./spawnbot >logging.txt 2>&1 &
disown