Wie zum Herunterfahren von Linux mit C++ oder Qt ohne Aufruf von "system()"?
Möchte ich abschalten einer Embedded Linux, wenn schließen-Schaltfläche gedrückt wird auf der Benutzeroberfläche. Ich weiß, ich kann es tun, mit einem Aufruf system
:
system("shutdown -P now");
Ref: Link
Aber zu wissen, dass mit system
ist nicht zu empfehlen, ich'ld gerne wissen, ob es einen anderen Weg, in C++ zu tun (wenn es auch eine bestimmte Art und Weise, dies zu tun mit Qt, ich'ld auch gerne wissen, obwohl es eine Allgemeine C++ - Methode ist wichtiger).
- Warum ist
system()
nicht beraten? - Lesen Sie über DBus. BTW, es ist ein
QDBus
api, denke ich. - aus einem ganz einfachen Grund, wenn der OP ist, die Qt benutzt, bedeutet es, dass es root-Rechte benötigen, innerhalb einer GUI-Anwendung, wirklich schlechte Idee. Programme aufrufen mit
system()
fast immer stellt ein Sicherheitsproblem. - es ist ein embedded system.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Unter Linux können Sie das system neu starten, Aufruf von poweroff, halt oder reboot.
Der folgende Codeausschnitt zeigt, wie poweroff eine Maschine, aber beachten Sie, dass es natürlich nur auf Linux zu arbeiten :
Natürlich, Sie benötigen ausreichende Berechtigungen zum verwenden dieser syscall.
system(reboot)
tut ?usleep
-ing einigen deciseconds vor, dassreboot
<sys/reboot.h>
sehen Sieint reboot(int __howto)
wrapper statt der direkten system-Aufruf-Signatur — das ist es, was die glibc bietet. Um auch wirklich den call mit magischen zahlen, die Sie haben zu verwendensyscall(2)
.Unter glibc benötigen Sie:
Wieder, wie immer, Sie müssen ausgeführt werden, mit ausreichenden Privilegien.
Wenn Ihr system systemd, dann können Sie logind Funktionalität via D-Bus. Qt Lösung ist folgende (gerade getestet):
Auch möglich, dass es eine Notwendigkeit, um eine Datei hinzuzufügen
/etc/polkit-1/localauthority/50-local.d/10-enable-shutdown.pkla
zu unterdrücken interaktive Authentifizierung Voraussetzung:Die Qt Weg ist
QProcess
zum ausführen des shutdown-Befehls:reboot
😡 (keine Hilfe-Seite einschließlichman
sagt, dass \o/)system()
- insbesondere der Befehl analysiert ist, die durch eine shell. Aber auch die anderenQProcess::startDetached()
, das akzeptiert eineQStringList
Argumente, die vermeidet einige der Probleme.Wenn Ihr problem ist, dass Sie denken, dass system() nicht sicher ist, können Sie
dann können Sie sicher sein, Sie verwenden die richtige shutdown-Funktion.
system()
die Gründe, warum es nicht empfohlen wird, geht weit darüber hinaus "mit der rechten shutdown-Funktion" 🙂 Aber vielen Dank!