调用“start”启动程序并“停止”以关闭C中的当前实例

时间:2010-10-22 12:41:10

标签: c

我在C中编写了一个简单的服务器,并希望能够像其他C守护进程一样调用它(例如使用./ftpd调用它来启动并使用./ftpd停止关闭该实例)。显然我遇到的问题是我不知道如何获取正在运行的程序的当前实例。我可以很好地解析选项(使用getopt / optarg)但是目前,。/ my-program停止只是启动一个新实例而不是调用./my-program start启动它。

我想这样做的原因是因为另一个程序将发信号通知我的服务器停止,所以像./my-program这样的调用停止非常简单,然后可以停止服务器循环并关闭所有打开的fd。谢谢!

是否可以在C程序中执行此操作,还是通常在外部处理?

3 个答案:

答案 0 :(得分:2)

使用'stop'参数运行时,您将始终运行单独的进程。 您需要找到正在运行的守护程序并向其发送信号以阻止它。当您的deamon启动时(选项'start'),您可能希望将其pid存储在某处,以便当它以'stop'选项启动时,它可以检索守护程序的pid并向其发送信号以阻止它。您还可以解析进程表以查找您的守护程序,但这会更复杂。

答案 1 :(得分:2)

查看killall命令。脚本中的start通常只是查看程序的实例是否已经存在,如果不存在则启动它。停止通常只是使用killall命令向服务发送信号。

您可能感兴趣的类似事情是编辑或替换守护程序的配置文件,然后向守护程序发送SIGHUP信号,告诉它应重新读取其配置。

另一个相关主题是通过使用某些特定选项调用守护程序的可执行文件来向守护程序发送特定消息。这是通过这种方式完成的,因为发送消息的接口可以改变,如果它是发送和接收的相同程序,则很难不同步。发送消息的方法也可能不同(Unix域套接字,命名管道,编辑配置文件和发送SIGHUP,几乎任何你能想象的)。另一个好处是程序在作为守护程序运行时使用的相同输入验证可以在它发送消息之前使用,因此如果有一个错误,守护程序会阻塞程序实例,那么你是从命令行调用可以继续并告诉你终端并拒绝将其传递给守护进程。

要查找正在运行的服务的PID,请使用pid文件(守护程序在某个位置创建一个文件,其中包含PID - 就像旧的锁文件一样,或者以killall的方式执行确实 - 查看/proc(特定于平台)。

答案 2 :(得分:1)

在我遇到的大多数Linux发行版中,守护进程是通过init脚本启动和停止的,而不是直接调用。

例如,在我的Ubuntu框中,我可以通过以下方式启动和停止wicd:

/etc/init.d/wicd start    /etc/init.d/wicd stop

......我认为这就是你想做的事。

正如其他一些人所说,为了停止正在运行的进程,你需要将PID存储在某处,然后使用该PID稍后向其发送信号。您可以自己在脚本中实现这一点,但大多数Linux发行版都提供帮助应用程序来处理这些问题,例如: Debian派生平台上的start-stop-daemon(8)(Redhat发行版有类似的东西,但我不记得我头顶的应用程序名称)。

所以,如果是我,我会写一个脚本来处理你的C守护进程的启动和停止,我会把这个脚本放在/etc/init.d中的其他一个上面,如上所述。