如何在C中使用Linux重新启动功能关闭Linux(Ubuntu)系统?

时间:2018-11-29 03:06:06

标签: c linux

我正在制作一个c程序来关闭Ubuntu,而无需使用following link进行系统调用。

code.c
#include <unistd.h>
#include <sys/reboot.h>
int main() {
reboot(RB_POWER_OFF);
}
gcc code.c -o out.exe

在这里,如果我以root用户身份运行此可执行文件(out.exe),则只有它会关闭系统,而如果我在普通用户模式下运行相同的文件,它将无法正常工作。为了在普通用户模式下运行此代码,我必须对代码进行哪些更改?

2 个答案:

答案 0 :(得分:3)

出于多种原因,最好使用例如以下方法关闭机器电源

execl("/bin/shutdown", "shutdown", "-P", "now", (char *)0);

或使用

重启
execl("/bin/shutdown", "shutdown", "-r", "now", (char *)0);

根本没有外壳。 shutdown系统管理命令代替了当前进程,如果允许正在运行该进程的用户关闭或重新启动计算机,则该命令已经具有必要的特权。

(也就是说,上面的语句之后的代码根本不会执行,除非缺少系统实用程序。它会出现在任何正常运行的系统上,甚至是嵌入式系统上。)

您甚至可以将"now"替换为"+1m"之类的固定字符串,以在一分钟后关闭或重新启动。 (在此期间,其他所有内容将继续正常运行。在此期间仅使用shutdown参数运行-c将会取消挂起的关机/重新启动。)

如果您是通过GUI应用程序执行此操作的,则只能在普通程序从returnmain()exit()的情况下执行。


这些原因是什么?

简单,健壮,最小惊喜的原则,适当的关机/重新引导特权管理,不需要特殊特权,因此减少了威胁面(程序中的错误很少授予特殊特权,因为没有)。对于初学者。

答案 1 :(得分:0)

如果代码以非root用户身份运行,则没有重新启动系统的权限。

最简单的方法是将可执行的set-uid设置为root:

sudo chown root:root out.exe
sudo chmod 4755 out.exe

然后任何用户都可以运行它,它将以root权限运行。