Запускать команды Linux из Daemon - PullRequest
1 голос
/ 21 июля 2010

Мне нужно запустить команду linux, такую ​​как "df", из моего демона linux, чтобы узнать свободное место, используемое пространство, общий размер раздела и другую информацию.У меня есть такие опции, как вызов system, exec, popen и т. Д.

  1. Но так как каждая команда порождает новый процесс, разве невозможно запускать команды в том же процессе, из которого она

  2. И в то же время, когда мне нужно запустить эту команду из демона linux, так как мой демон не должен содержать ни одного терминала.Повлияет ли это на поведение моего демона?

Или это какой-нибудь стандартный API C или C ++ для получения информации о смонтированных разделах

Ответы [ 2 ]

4 голосов
/ 21 июля 2010

Нет стандартного API, так как это концепция для конкретной ОС.

Тем не менее,

  1. Вы можете анализировать /proc/mounts (или /etc/mtab) с помощью (непереносимых) getmntent / getmntent_r вспомогательных функций.
  2. Используя информацию о смонтированных файловых системах, вы можете получить ее статистику с помощью statfs.
1 голос
/ 21 июля 2010

Может оказаться полезным изучить исходный код программы i3status: http://code.stapelberg.de/git/i3status/tree/src/print_disk_info.c

Чтобы ответить на другие ваши вопросы:

Но так как каждая команда порождает новый процесс, разве нельзя запускать команды в том же процессе, из которого она вызывается?

Нет; целые «команды» - это автономные программы, которые должны выполняться в своем собственном процессе.

В зависимости от того, как часто вы хотите выполнять свои программы, fork();exec() не так уж и плох. Нет жестких ограничений, за которыми было бы лучше собирать данные самостоятельно, чем выполнять вспомогательную программу. Раз в минуту вы, вероятно, прекрасно выполняете команды. Раз в секунду вам, вероятно, лучше собирать данные самостоятельно. Я не уверен, где находится разделительная линия.

И в то же время, когда мне нужно запустить эту команду из демона linux, мой демон не должен содержать ни одного терминала. Повлияет ли это на поведение моего демона?

Если команда вызывает setsid(2), тогда open(2) на терминале без включения O_NOCTTY, этот терминал может стать управляющим терминалом для этого процесса. Но это не повлияет на вашу программу, потому что ваша программа уже отказалась от терминала, когда становилась демоном, и, поскольку дочерний процесс является лидером сеанса, он не может изменить управляющий терминал вашего процесса.

...