UIで閉じるボタンが押されたときに組み込みLinuxをシャットダウンしたい。 system
を呼び出すことでそれができることを私は知っています:
system("shutdown -P now");
参照: リンク
しかし、system
を使用することはお勧めできないことを知っているので、これを行う別の方法がC++にあるかどうかを知りたいです(Qtを使用してこれを行う特定の方法もある場合は、一般的なC++メソッドの方が重要ですが、それを知ってください)。
Linuxでは、再起動システムコールを呼び出して、電源をオフにしたり、停止したり、再起動したりできます。次のスニペットは、マシンの電源を切る方法を示していますが、もちろんLinuxでのみ機能することに注意してください。
#include <unistd.h>
#include <linux/reboot.h>
int main() {
reboot(LINUX_REBOOT_MAGIC1,
LINUX_REBOOT_MAGIC2,
LINUX_REBOOT_CMD_POWER_OFF, 0);
}
もちろん、このシステムコールを使用するには十分な権限が必要です。
Glibcでは、次のものが必要です。
#include <unistd.h>
#include <linux/reboot.h>
#include <sys/reboot.h>
int main() {
sync();
reboot(LINUX_REBOOT_CMD_POWER_OFF);
}
繰り返しになりますが、いつものように、十分な特権を持って実行する必要があります。
システムにsystemdがある場合は、 logindを使用できます。 )D-Busを介した機能。 Qtソリューションは次のとおりです(テスト済み):
QDBusInterface logind{"org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", QDBusConnection::systemBus()};
const auto message = logind.callWithArgumentList(QDBus::Block, "CanPowerOff", {});
QDBusPendingReply< QString > canPowerOff = message;
Q_ASSERT(canPowerOff.isFinished());
if (canPowerOff.isError()) {
const auto error = canPowerOff.error();
qWarning().noquote()
<< QDBusInterface::tr("Asynchronous call finished with error: %1 (%2)")
.arg(error.name(), error.message());
return EXIT_FAILURE;
}
if (canPowerOff.value() == "yes") {
QDBusPendingReply<> powerOff = logind.callWithArgumentList(QDBus::Block, "PowerOff", {true, });
Q_ASSERT(powerOff.isFinished());
if (powerOff.isError()) {
const auto error = powerOff.error();
qWarning().noquote()
<< QDBusInterface::tr("Asynchronous call finished with error: %1 (%2)")
.arg(error.name(), error.message());
return EXIT_FAILURE;
}
} else {
qCritical().noquote()
<< QCoreApplication::translate("poweroff", "Can't power off: CanPowerOff() result is %1")
.arg(canPowerOff.value());
return EXIT_FAILURE;
}
また、ファイルを追加する必要がある可能性もあります/etc/polkit-1/localauthority/50-local.d/10-enable-shutdown.pkla
対話型認証要件を抑制するには:
[Enable shoutdown for users]
Identity=unix-group:users
Action=org.freedesktop.login1;org.freedesktop.login1.power-off;org.freedesktop.login1.power-off-ignore-inhibit;org.freedesktop.login1.power-off-multiple-sessions
ResultAny=yes
ResultInactive=yes
ResultActive=yes
Qtの方法は、QProcess
を使用してshutdownコマンドを実行することです。
QProcess process;
process.startDetached("shutdown -P now");
System()が安全でないと思うことが問題である場合は、次を使用できます。
system("/bin/sh shutdown -P now");
そうすれば、正しいシャットダウン機能を使用していることを確認できます。