web-dev-qa-db-ja.com

「system()」を呼び出さずにC ++またはQtを使用してLinuxをシャットダウンするにはどうすればよいですか?

UIで閉じるボタンが押されたときに組み込みLinuxをシャットダウンしたい。 systemを呼び出すことでそれができることを私は知っています:

system("shutdown -P now");

参照: リンク

しかし、systemを使用することはお勧めできないことを知っているので、これを行う別の方法がC++にあるかどうかを知りたいです(Qtを使用してこれを行う特定の方法もある場合は、一般的なC++メソッドの方が重要ですが、それを知ってください)。

8
Momergil

Linuxでは、再起動システムコールを呼び出して、電源をオフにしたり、停止したり、再起動したりできます。次のスニペットは、マシンの電源を切る方法を示していますが、もちろんLinuxでのみ機能することに注意してください。

#include <unistd.h>
#include <linux/reboot.h>

int main() {
    reboot(LINUX_REBOOT_MAGIC1, 
           LINUX_REBOOT_MAGIC2, 
           LINUX_REBOOT_CMD_POWER_OFF, 0);
}

もちろん、このシステムコールを使用するには十分な権限が必要です。

14
tux3

Glibcでは、次のものが必要です。

#include <unistd.h>
#include <linux/reboot.h>
#include <sys/reboot.h>

int main() {
    sync();
    reboot(LINUX_REBOOT_CMD_POWER_OFF);
}

繰り返しになりますが、いつものように、十分な特権を持って実行する必要があります。

9
Nathan Phillips

システムに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
4
Orient

Qtの方法は、QProcessを使用してshutdownコマンドを実行することです。

QProcess process;
process.startDetached("shutdown -P now");
3
Nejat

System()が安全でないと思うことが問題である場合は、次を使用できます。

system("/bin/sh shutdown -P now");

そうすれば、正しいシャットダウン機能を使用していることを確認できます。

0
martinsurleweb