![当程序在后台运行时文件描述符被损坏](https://linux22.com/image/230952/%E5%BD%93%E7%A8%8B%E5%BA%8F%E5%9C%A8%E5%90%8E%E5%8F%B0%E8%BF%90%E8%A1%8C%E6%97%B6%E6%96%87%E4%BB%B6%E6%8F%8F%E8%BF%B0%E7%AC%A6%E8%A2%AB%E6%8D%9F%E5%9D%8F.png)
我为嵌入式Linux系统(petalinux)编写了一个程序。从终端或 TCF 调试器启动时,它运行良好。但是,我希望它在系统启动时运行,因此我使用了 start-stop-daemon。这在某些方面有效,但现在完全停止了。我看到的是程序正确启动,打开一些用于 GPIO 和 I2C 访问的文件,并且可以正确地对它们进行操作。然后,大约 8 秒后,这些文件描述符突然变坏(Errno 9),并且软件崩溃或至少不再工作。
进一步的测试表明,通过 bash 脚本在后台启动程序时也会发生这种情况:
#!/bin/bash
/home/user/myApp.elf &
在此脚本中,不将其放在后台是可行的。此外,直接从后台终端启动程序也是可行的。我通过 /etc/profile.d 脚本直接启动它,这更像是一种解决方案。
我之前怀疑存在某种内存溢出或损坏,但到目前为止直接执行程序总是有效,而在后台启动它总是失败,这对我来说并不像是明显的内存问题。那么,后台进程的文件描述符发生变化或被修改时,是否会发生一些 Linux 魔法或怪异现象呢?是否有一些内存管理问题我没有正确处理?是否有一些我没有正确处理的系统调用?