如何从C ++程序中重新启动Linux?

我有一个Qt 4 GUI,我需要在下拉菜单中有一个选项,允许用户select重新启动计算机。 我意识到这可能似乎与其他方式重新启动计算机的能力,但select需要留在那里。 我已经尝试使用system()来调用以下内容:

  1. 一个suid-root shell脚本
  2. 一个非suid的shell脚本
  3. 一个suid-root二进制程序

所有这些都是正因为如此

 重新启动:必须是超级用户 

被打印。 使用system()来直接调用重启也是一样的。 我并不特别用system()来做到这一点,但它似乎是最直接的select。

我如何从GUI重新启动系统?

在Linux中:

#define LINUX_REBOOT_CMD_POWER_OFF 0x4321fedc sync(); reboot(LINUX_REBOOT_CMD_POWER_OFF); 

Linux程序员手册中描述了reboot功能。 在glibc下 ,你可以传递RB_AUTOBOOT宏常量来执行重启。

请注意,如果reboot之前未进行sync呼叫,则数据可能会丢失。

Linux中使用glibc

 #include <unistd.h> #include <sys/reboot.h> sync(); reboot(RB_AUTOBOOT); 

你有没有尝试运行一个shell脚本,使用gksudo? 就像是

 gksudo shutdown -r 

运气好的话,应该拉起一个模态对话来获取用户凭据。

suid-ing shell脚本就像刚才提到的那样是危险的(这就是为什么不起作用)。

我怀疑,suid的二进制不工作,因为系统用用户的实际uid而不是suid的子进程,出于安全原因(它可以让你替换任何二进制文件被调用,并作为根运行)。

你可以把一个重启的副本保护在一个位置,只有你想要的用户有权限才能执行它,然后suid-root这个。

或者给他们sudoer特权执行只是你关心的命令和系统出来的东西像"ksh -c 'sudo reboot'"

在二进制尝试调用

 setuid (0); 

在system()调用之前。

你将如何从系统上的命令行重新启动系统?

基本上做

 system( <however you wouuld do it from the command line> ); 

这应该在几乎任何Linux系统上都可以做到。

 #include <unistd.h> #include <sys/reboot.h> int main () { sync(); setuid(0); reboot(RB_AUTOBOOT); return(0); } 

然后用gcc reboot.c -o reboot编译,然后在二进制文件上执行chmod a+s reboot 。 然后以任何用户的身份打电话重启,系统应该顺利重启。 通过GUI执行此操作的方式各不相同,例如,如果您的桌面环境是KDE,则与在Fluxbox下执行相同的操作完全不同。