在树莓派(最近的树莓派)上,我编写了一个应用程序,它通过网络请求按需生成一个应用程序,并通过不同的网络请求按需杀死它。生成机制只是 fork/exec。使用 kill(childPid, SIGQUIT) 完成杀戮。正如您所想的那样,它就像一块简单的 C++,并且运行良好。
也就是说,它工作正常,除非我从 /etc/rc.local 启动它。从那里启动它的命令只是一个适当的 cd 然后
./effectPlayer &
它启动正常,接收请求正常,生成正常(它跨越一个 aplay,因此判断它何时工作是微不足道的)但完全无法根据请求杀死 aplay 子进程。它正常调用 kill() 并且 kill() 返回 0。但是 aplay 继续播放。
我认为这与从 /etc/rc.local 生成它在 fork 或 kill 中赋予它一些特殊行为这一事实有关,但我不明白是什么。我错过了什么?
编辑:添加问题的答案。从 /etc/rc.local 运行并打开日志记录,应用程序报告:
23:10:06 10-11-2019 (effectPlayer) 7: P1 64 elvenHall #command to start playing
23:10:06 10-11-2019 (sound) launched 1083: /usr/bin/aplay -q -... #what it forks/execs
23:10:10 10-11-2019 (effectPlayer) 7: X1000 #command to stop playing
23:10:10 10-11-2019 (sound) sending 3 to 1083, result 0 0 #what kill() is asked to do
翻译,它被要求播放一个特定的效果并产生一个 aplay 来处理它。它可以工作(我听到音频),然后我发送一个命令停止所有播放。它使用正确的信号成功地在正确的 PID 上调用 kill(),并且 kill() 返回 0 且 errno=0。除了 aplay 仍在运行。
当我从命令行执行相同的序列时,它的作用都是一样的,除了 aplay 实际上死了。
当我将 SIGQUIT 换成 SIGKILL 时,它按预期工作:无论 effectsPlayer 如何启动,aplay 都会死掉。
我现在要把它归结为游戏中的一些奇怪之处。我不喜欢使用 SIGKILL - 可能会跳过重要的清理工作。但它的工作...