2010-07-21 205 views
1

我需要从我的linux守护进程运行一个linux命令,例如“df”来知道可用空间,已用空间,parition的总大小以及其他信息。我有一个像呼叫系统,EXEC,POPEN等选项..从Daemon运行Linux命令

  1. 但因为这每个命令产生新的进程,这是不可能运行从调用它在同一个进程中的命令?

  2. 与此同时,我需要从一个Linux守护进程运行这个命令,因为我的守护进程不应该持有任何终端。它会影响我的守护进程行为吗?

或者是它们的任何C或C++标准用于获取安装paritions信息

回答

4

没有标准 API的API,因为这是一个特定于操作系统的概念。

然而,

  1. 您可以分析/proc/mounts(或/etc/mtab)与(非便携式)getmntent/getmntent_r辅助功能。
  2. 使用关于已挂载文件系统的信息,您可以使用statfs获取其统计信息。
+0

这也将提供有关免费和已用空间的信息 – Poorna 2010-07-21 03:41:35

+0

@siri,我用更好的选项更新了答案(是的,它会)。 – 2010-07-21 03:52:48

+0

我只想确认从守护进程运行命令是对还是错,以及它可能产生的副作用 – Poorna 2010-07-21 04:01:37

1

你可能会发现,探索i3status程序的源代码:http://code.stapelberg.de/git/i3status/tree/src/print_disk_info.c

为了回答您的其他问题:

但因为这每一个命令产生新的进程,这是不可能的在调用它的同一个进程中运行这些命令?

否;完整的'命令'是自包含的程序,必须在自己的过程中运行。

取决于你希望执行你的程序的频率,fork();exec()并不是那么糟糕。除了执行帮助程序之外,您自己收集数据会更好。一分钟,你可能正在执行命令。每秒一次,你可能会更好地自己收集数据。我不确定分界线在哪里。

与此同时,我需要从一个Linux守护进程运行这个命令,因为我的守护进程不应该持有任何终端。它会影响我的守护进程行为吗?

如果命令调用setsid(2),然后在终端上open(2)而不包括O_NOCTTY,该终端might成为该过程控制终端。但是这不会影响你的程序,因为你的程序在成为守护进程时已经拒绝了终端,并且由于子进程是会话负责人,所以它不能更改进程的控制终端。