Может оказаться полезным изучить исходный код программы i3status
: http://code.stapelberg.de/git/i3status/tree/src/print_disk_info.c
Чтобы ответить на другие ваши вопросы:
Но так как каждая команда порождает новый процесс, разве нельзя запускать команды в том же процессе, из которого она вызывается?
Нет; целые «команды» - это автономные программы, которые должны выполняться в своем собственном процессе.
В зависимости от того, как часто вы хотите выполнять свои программы, fork();exec()
не так уж и плох. Нет жестких ограничений, за которыми было бы лучше собирать данные самостоятельно, чем выполнять вспомогательную программу. Раз в минуту вы, вероятно, прекрасно выполняете команды. Раз в секунду вам, вероятно, лучше собирать данные самостоятельно. Я не уверен, где находится разделительная линия.
И в то же время, когда мне нужно запустить эту команду из демона linux, мой демон не должен содержать ни одного терминала. Повлияет ли это на поведение моего демона?
Если команда вызывает setsid(2)
, тогда open(2)
на терминале без включения O_NOCTTY
, этот терминал может стать управляющим терминалом для этого процесса. Но это не повлияет на вашу программу, потому что ваша программа уже отказалась от терминала, когда становилась демоном, и, поскольку дочерний процесс является лидером сеанса, он не может изменить управляющий терминал вашего процесса.