第三章
3-1 使用Linux转有的reboot()系统调用重启系统时,必须讲第二个参数magic2定义为一组magic号之一。这些magic号有什么意义?
我们可以使用如下代码来执行重启。
#include <unistd.h>
#include <sys/reboot.h>
int main(){
reboot(RB_AUTOBOOT);
return 0;
}
将文件保存为reboot.c
,使用gcc reboot.c
命令进行编译。然后运行sudo ./a.out
,此时可以看到系统进行了重启。不使用root权限无法重启。
RB_AUTOBOOT
是定义在reboot.h头文件中的。如果我们换成RB_POWER_OFF
则系统直接关机。下面是该头文件节选。
/* Perform a hard reset now. */
#define RB_AUTOBOOT 0x01234567
/* Stop system and switch power off if possible. */
#define RB_POWER_OFF 0x4321fedc
在其他的Linux中,我们也可以使用如下的程序进行重启。可惜这段代码在deepin中无法编译通过。
#include <unistd.h>
#include <linux/reboot.h>
int main(){
reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2A, LINUX_REBOOT_CMD_RESTART, 0);
return 0;
}
这里的LINUX_REBOOT_MAGIC1
、LINUX_REBOOT_MAGIC2A
参数在linux/reboot.h
中被定义。如果我们不传入这样的参数,则功能不会执行。
至于这些参数是什么意义,除了防止误调用,是Linux的作者Linus Torvalds自己和他三个女儿的生日。