Linux 启动流程并在后期终止

Linux 启动流程并在后期终止,linux,ipc,rpc,Linux,Ipc,Rpc,在我写的SDK中,集成商将通过本地套接字连接与之通信 从集成应用程序开始,我需要一种方法来启动SDK作为一个进程,但更重要的是,我需要能够在主应用程序关闭时取消该进程 这个问题与语言无关(我认为),因为我认为挑战与linux有关。i、 e.如何启动程序并在稍后阶段取消 一些可能的办法: 我认为这是一个通过exec启动程序的例子,得到它的PID或一些ID,然后用它来杀死以后。Sudo可能需要这样做,但这并不理想。此外,这不是一个好的做法,因为您将有效地强制关闭SDK,没有时间进行清理 通过任何方

在我写的SDK中,集成商将通过本地套接字连接与之通信

从集成应用程序开始,我需要一种方法来启动SDK作为一个进程,但更重要的是,我需要能够在主应用程序关闭时取消该进程

这个问题与语言无关(我认为),因为我认为挑战与linux有关。i、 e.如何启动程序并在稍后阶段取消

一些可能的办法:

  • 我认为这是一个通过exec启动程序的例子,得到它的PID或一些ID,然后用它来杀死以后。Sudo可能需要这样做,但这并不理想。此外,这不是一个好的做法,因为您将有效地强制关闭SDK,没有时间进行清理
  • 通过任何方式启动程序。一旦准备好关闭,只需通过SDK API发送一个“shutdown”命令,该命令将允许SDK清理、管理状态,然后退出应用程序

这方面的最佳实践是什么?

假设您使用的是Linux或类似的Unix:

你在正确的轨道上。你不需要sudo。到目前为止,这些评论指向了正确的方向,但没有详细说明细节

有关此处提到的功能的详细信息,请参见手册第2节(
man 2…
)。它们是为从C打电话记录的。我没有Go的经验来帮助确定如何在那里使用它们

integrator应用程序将被称为“父”流程。SDK-as-a-process将被称为“子”流程。进程通过调用fork()创建子进程并成为其父进程。新进程是父进程的副本,运行相同的代码,并且大多数情况下具有相同的状态(内存中的数据)。但是fork()向父级和子级返回不同的值,因此每个值都可以确定其在关系中的角色。这包括将子进程的进程标识符(pid)通知父进程。坚持这个价值观。然后,子进程使用exec()在现有进程中执行不同的程序,即SDK二进制文件。fork-then-exec的另一个替代方法是posix_-spawn(),它具有相当复杂的参数(但如果需要,可以提供更大的控制)

将子进程设计为响应信号而关闭,而不是通过API发出命令,将允许父进程以外的进程以标准方式启动干净关闭。例如,这可能对管理员或用户有用;它允许从shell命令行或脚本发送关机信号

子进程通过调用signal()(或为其可移植性而推荐的更复杂的sigaction())安装一个信号处理程序函数,该函数将在子进程接收到信号时调用。可以发送/接收不同的信号,由不同的整数值(以及SIGTERM等名称)标识。在调用signal()时,您可以指出您感兴趣接收的内容。当您的信号处理函数被调用时,您已经收到信号,并且可以启动干净关机

当父级希望子级完全关闭时,父级将使用名为kill()的命令向子级发送一个信号。不幸的是,由于信号可用于其他目的,因此命名为。无论如何,您要将pid(由fork()返回)和要发送的特定信号(例如SIGTERM)传递给kill()

父级还可以通过调用waitpid()来确定子级何时完全关闭,再次传递fork()返回的pid;或者通过注册来接收信号SIGCHLD。注册以在fork()/exec()之前接收SIGCHLD,否则可能会错过该信号

实际上,在接收到SIGCHLD之后调用waitpid()是很重要的,这可以选择,以便释放持有子进程退出状态的资源,这样操作系统就可以清理进程的最后一个剩余部分。如果不这样做,则会使孩子成为一个“僵尸”进程,无法完全回收。僵尸太多,操作系统将无法启动新进程

如果某个进程拒绝干净地或按您要求的速度关闭,您可以通过发送SIGKILL信号强制它退出(不执行其清理代码)

手册页中提到了exec()、waitpid()和posix_spawn()的变体,它们具有不同的名称和行为。

1)为什么要使用
sudo
终止您创建的进程?它应该具有与调用程序相同的权限。2) 有什么理由先验地排除
信号吗?1)我不确定您是否要求sudo杀死一个进程。2) 我不知道有什么信号。。请详细说明..1)据我所知,没有2)给定一个信号,您可以为它设置一个信号处理程序,这是一个函数,每当信号通过中断异步传递到进程时就会触发。因此,您可以向应用程序发送特定的信号,并定义一个信号处理程序,该处理程序通过适当地释放其资源来优雅地终止应用程序。具体细节可能取决于您使用的技术(进程、posix线程等)。您可以在此处找到更多信息->