linux下c程序调用reboot函数实现直接重启【转】

简介:

转自:http://www.blog.chinaunix.net/uid-20564848-id-73878.html

linux下c程序调用reboot函数实现直接重启

  当然你也可以直接调用system("reboot"),但是这里完全基于库函数来实现,不依赖于/sbin/reboot这个外部程序
这里reboot()的其他命令,比如RB_POWER_OFF,并不能保证关闭计算机电源.

#include <unistd.h>
#include <sys/reboot.h>
int main()
{
    sync(); // 同步磁盘数据,将缓存数据回写到硬盘,以防数据丢失[luther.gliethttp]
    return reboot(RB_AUTOBOOT);
}

luther@gliethttp:~vim /usr/include/sys/reboot.h /* Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.    This file is part of the GNU C Library.     The GNU C Library is free software; you can redistribute it and/or    modify it under the terms of the GNU Lesser General Public    License as published by the Free Software Foundation; either    version 2.1 of the License, or (at your option) any later version.     The GNU C Library is distributed in the hope that it will be useful,    but WITHOUT ANY WARRANTY; without even the implied warranty of    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU    Lesser General Public License for more details.     You should have received a copy of the GNU Lesser General Public    License along with the GNU C Library; if not, write to the Free    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA    02111-1307 USA.  */  /* This file should define RB_* macros to be used as flag    bits in the argument to the `reboot' system call.  */  #ifndef _SYS_REBOOT_H #define _SYS_REBOOT_H    1  #include <features.h>  /* Perform a hard reset now.  */ #define RB_AUTOBOOT    0x01234567  /* Halt the system.  */ #define RB_HALT_SYSTEM    0xcdef0123  /* Enable reboot using Ctrl-Alt-Delete keystroke.  */ #define RB_ENABLE_CAD    0x89abcdef  /* Disable reboot using Ctrl-Alt-Delete keystroke.  */ #define RB_DISABLE_CAD    0  /* Stop system and switch power off if possible.  */ #define RB_POWER_OFF    0x4321fedc  __BEGIN_DECLS  /* Reboot or halt the system.  */ extern int reboot (int __howto) __THROW;  __END_DECLS  #endif    /* _SYS_REBOOT_H */  luther@gliethttp:~vim /usr/include/sys/reboot.h /* Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.    This file is part of the GNU C Library.     The GNU C Library is free software; you can redistribute it and/or    modify it under the terms of the GNU Lesser General Public    License as published by the Free Software Foundation; either    version 2.1 of the License, or (at your option) any later version.     The GNU C Library is distributed in the hope that it will be useful,    but WITHOUT ANY WARRANTY; without even the implied warranty of    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU    Lesser General Public License for more details.     You should have received a copy of the GNU Lesser General Public    License along with the GNU C Library; if not, write to the Free    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA    02111-1307 USA.  */  /* This file should define RB_* macros to be used as flag    bits in the argument to the `reboot' system call.  */  #ifndef _SYS_REBOOT_H #define _SYS_REBOOT_H    1  #include <features.h>  /* Perform a hard reset now.  */ #define RB_AUTOBOOT    0x01234567  /* Halt the system.  */ #define RB_HALT_SYSTEM    0xcdef0123  /* Enable reboot using Ctrl-Alt-Delete keystroke.  */ #define RB_ENABLE_CAD    0x89abcdef  /* Disable reboot using Ctrl-Alt-Delete keystroke.  */ #define RB_DISABLE_CAD    0  /* Stop system and switch power off if possible.  */ #define RB_POWER_OFF    0x4321fedc  __BEGIN_DECLS  /* Reboot or halt the system.  */ extern int reboot (int __howto) __THROW;  __END_DECLS  #endif    /* _SYS_REBOOT_H */  luther@gliethttp:~man 2 reboot

REBOOT(2)                  Linux Programmer’s Manual                 REBOOT(2)



NAME
       reboot - reboot or enable/disable Ctrl-Alt-Del

SYNOPSIS
       /* For libc4 and libc5 the library call and the system call
          are identical, and since kernel version 2.1.30 there are
          symbolic names LINUX_REBOOT_* for the constants and a
          fourth argument to the call: */

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

       int reboot(int magic, int magic2, int cmd, void *arg);

       /* Under glibc some of the constants involved have gotten
          symbolic names RB_*, and the library call is a 1-argument
          wrapper around the 3-argument system call: */

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

       int reboot(int cmd);

DESCRIPTION
       The  reboot()  call  reboots the system, or enables/disables the reboot
       keystroke (abbreviated CAD, since the default  is  Ctrl-Alt-Delete;  it
       can be changed using loadkeys(1)).

       This   system   call  will  fail  (with  EINVAL)  unless  magic  equals
       LINUX_REBOOT_MAGIC1   (that   is,   0xfee1dead)   and   magic2   equals
       LINUX_REBOOT_MAGIC2  (that  is, 672274793).  However, since 2.1.17 also
       LINUX_REBOOT_MAGIC2A  (that  is,  85072278)  and  since   2.1.97   also
       LINUX_REBOOT_MAGIC2B   (that  is,  369367448)  and  since  2.5.71  also
       LINUX_REBOOT_MAGIC2C (that is, 537993216) are permitted  as  value  for
       magic2.   (The  hexadecimal  values of these constants are meaningful.)
       The cmd argument can have the following values:

       LINUX_REBOOT_CMD_RESTART
              (RB_AUTOBOOT, 0x1234567).  The message "Restarting  system."  is
              printed, and a default restart is performed immediately.  If not
              preceded by a sync(2), data will be lost.

       LINUX_REBOOT_CMD_HALT
              (RB_HALT_SYSTEM, 0xcdef0123; since 1.1.76).  The message "System
              halted." is printed, and the system is halted.  Control is given
              to the ROM monitor, if there is  one.   If  not  preceded  by  a
              sync(2), data will be lost.

       LINUX_REBOOT_CMD_POWER_OFF
              (0x4321fedc;  since  2.1.30).   The  message  "Power  down."  is
              printed, the system is stopped, and all power  is  removed  from
              the  system,  if  possible.   If not preceded by a sync(2), data
              will be lost.

       LINUX_REBOOT_CMD_RESTART2
              (0xa1b2c3d4; since 2.1.30).  The message "Restarting system with
              command  '%s'"  is  printed,  and  a  restart (using the command
              string given in arg) is performed immediately.  If not  preceded
              by a sync(2), data will be lost.

       LINUX_REBOOT_CMD_CAD_ON
              (RB_ENABLE_CAD,  0x89abcdef).   CAD is enabled.  This means that
              the CAD keystroke will immediately cause the  action  associated
              with LINUX_REBOOT_CMD_RESTART.

       LINUX_REBOOT_CMD_CAD_OFF
              (RB_DISABLE_CAD,  0).  CAD is disabled.  This means that the CAD
              keystroke will cause a SIGINT signal to be sent to init (process
              1),  whereupon  this  process  may  decide  upon a proper action
              (maybe: kill all processes, sync, reboot).

       Only the superuser may call reboot().

       The precise effect of the above actions depends  on  the  architecture.
       For the i386 architecture, the additional argument does not do anything
       at present (2.1.122), but the type of reboot can be determined by  ker‐
       nel  command-line  arguments  ("reboot=...") to be either warm or cold,
       and either hard or through the BIOS.

RETURN VALUE
       For the values of cmd that stop or restart  the  system,  a  successful
       call  to  reboot()  does not return.  For the other cmd values, zero is
       returned on success.  In all cases, -1  is  returned  on  failure,  and
       errno is set appropriately.

ERRORS
       EFAULT Problem      with      getting      userspace     data     under
              LINUX_REBOOT_CMD_RESTART2.

       EINVAL Bad magic numbers or cmd.

       EPERM  The calling process has insufficient privilege to call reboot();
              the CAP_SYS_BOOT capability is required.

CONFORMING TO
       reboot() is Linux-specific, and should not be used in programs intended
       to be portable.

SEE ALSO
       sync(2),   bootparam(7),   capabilities(7),   ctrlaltdel(8),   halt(8),
       reboot(8)

COLOPHON
       This  page  is  part of release 3.01 of the Linux man-pages project.  A
       description of the project, and information about reporting  bugs,  can
       be found at http://www.kernel.org/doc/man-pages/.



Linux                             2008-02-11                         REBOOT(2)

 

vim /usr/include/sys/reboot.h
--------------------------------------------------
#define RB_AUTOBOOT          0x01234567
#define RB_HALT_SYSTEM       0xcdef0123
#define RB_ENABLE_CAD        0x89abcdef
#define RB_DISABLE_CAD       0
#define RB_POWER_OFF         0x4321fedc 




1 sys_reboot() -->
2     kernel_restart() -->
3        kernel_restart_prepare()
4        machine_restart()




linux-2.6.21.7/include/linux/reboot.h
--------------------------------------------
#define    LINUX_REBOOT_CMD_RESTART     0x01234567
#define    LINUX_REBOOT_CMD_HALT        0xCDEF0123
#define    LINUX_REBOOT_CMD_CAD_ON      0x89ABCDEF
#define    LINUX_REBOOT_CMD_CAD_OFF     0x00000000
#define    LINUX_REBOOT_CMD_POWER_OFF   0x4321FEDC
#define    LINUX_REBOOT_CMD_RESTART2    0xA1B2C3D4
#define    LINUX_REBOOT_CMD_SW_SUSPEND  0xD000FCE2
#define    LINUX_REBOOT_CMD_KEXEC       0x45584543

 









本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/5263181.html,如需转载请自行联系原作者

相关文章
|
18天前
|
Linux
关于Linux目录访问函数总结
关于Linux目录访问函数总结
13 1
|
24天前
|
算法 Linux C++
【Linux系统编程】深入解析Linux中read函数的错误场景
【Linux系统编程】深入解析Linux中read函数的错误场景
196 0
|
1月前
|
存储 监控 Linux
【Linux IO多路复用 】 Linux下select函数全解析:驾驭I-O复用的高效之道
【Linux IO多路复用 】 Linux下select函数全解析:驾驭I-O复用的高效之道
50 0
|
24天前
|
存储 算法 Linux
【Linux系统编程】深入理解Linux目录扫描函数:scandir目录函数(按条件扫描目录
【Linux系统编程】深入理解Linux目录扫描函数:scandir目录函数(按条件扫描目录
37 0
|
28天前
|
安全 Shell Linux
【Shell 命令集合 系统管理 】⭐⭐⭐Linux 重启 reboot命令 使用指南
【Shell 命令集合 系统管理 】⭐⭐⭐Linux 重启 reboot命令 使用指南
38 0
|
1月前
|
缓存 Ubuntu 网络协议
Linux系统编程之文件I/O函数的使用:介绍文件I/O函数的基本概念、用法和实现方式
Linux系统编程之文件I/O函数的使用:介绍文件I/O函数的基本概念、用法和实现方式
20 1
|
1月前
|
网络协议 Linux API
Linux网络编程:shutdown() 与 close() 函数详解:剖析 shutdown()、close() 函数的实现原理、参数说明和使用技巧
Linux网络编程:shutdown() 与 close() 函数详解:剖析 shutdown()、close() 函数的实现原理、参数说明和使用技巧
69 0
|
12天前
|
Linux 开发者
Linux文件编程(open read write close函数)
通过这些函数,开发者可以在Linux环境下进行文件的读取、写入和管理。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
84 4
|
24天前
|
存储 Unix Linux
深入理解 Linux 系统下的关键网络接口和函数,gethostent,getaddrinfo,getnameinfo
深入理解 Linux 系统下的关键网络接口和函数,gethostent,getaddrinfo,getnameinfo
14 0
|
28天前
|
Shell Linux C语言
【Shell 命令集合 系统设置 内置命令】⭐⭐Linux 测量程序的执行时间和资源使用情况 time命令 使用指南
【Shell 命令集合 系统设置 内置命令】⭐⭐Linux 测量程序的执行时间和资源使用情况 time命令 使用指南
31 0