使用哪种服务管理软件,是一个比较困难的问题。通常,最好的选择是使用您的操作系统捆绑的任何服务管理软件——通常该软件也作为进程 ID 0 运行并由内核直接启动。目前,现代基于 Linux 的操作系统中最突出的此类软件是 SystemD,它提供了许多功能,例如丰富的依赖管理语言、套接字激活、计时器、网络和存储管理等等。AFAIK,在嵌入式 Linux 操作系统中,这种情况并不常见,并且您的嵌入式系统可能使用经典的 SysV,它不太擅长重新启动失败的服务(或者通常根本不这样做 - 它将该任务留给“服务脚本”,并且大多数实现不执行任何类型的重新启动)。
我将首先解决问题标题:守护进程和正常运行的进程之间的区别在于,大多数情况下,当您说“正常进程”时,您的意思是连接到用户输入/输出 API 的东西,例如文本终端 (通常通过打开文件描述符表中的前 3 个文件描述符并连接到某种虚拟终端)或图形用户界面(在 Linux 和 UNIX 上通常使用 X11 协议)。另一方面,守护进程通常是指已与终端分离或从未连接到终端的进程。
至于问题本身,无论是作为守护进程运行还是作为“正常进程”运行时,应用程序都可能崩溃并需要重新启动。当进程连接到某个用户终端时,用户可以检测到故障并重新启动应用程序,但守护程序通常不喜欢该功能 - 当守护程序与终端断开连接时,检测到进程崩溃了。
为了解决这个问题,我们发明了服务管理框架。有许多不同的实现,具有不同的特性:SysV、SystemD、Upstart、Supervisord、runit 等等。它们都有一个非常重要的特性:它们有一些方法可以启动一个守护程序(通常在启动时自动)监视它,直到它失败,然后重新启动它。
您是否应该使用服务管理框架来运行您的设备驱动程序服务?你绝对应该——这是唯一理智的方法。
使用哪种服务管理软件,是一个比较困难的问题。通常,最好的选择是使用您的操作系统捆绑的任何服务管理软件——通常该软件也作为进程 ID 0 运行并由内核直接启动。目前,现代基于 Linux 的操作系统中最突出的此类软件是 SystemD,它提供了许多功能,例如丰富的依赖管理语言、套接字激活、计时器、网络和存储管理等等。AFAIK,在嵌入式 Linux 操作系统中,这种情况并不常见,并且您的嵌入式系统可能使用经典的 SysV,它不太擅长重新启动失败的服务(或者通常根本不这样做 - 它将该任务留给“服务脚本”,并且大多数实现不执行任何类型的重新启动)。