zoukankan      html  css  js  c++  java
  • 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:~$ 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

  • 相关阅读:
    如果拷贝项目出现各种找不到文件的时候,基本就是没有标记,或者文件名的问题,Could not find resource mybatis.xml,解决方法
    The error may exist in com/bjpowernode/dao/StudentDao.xml ### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderExcept
    一个简单jpa例子
    @PathVariable
    java.lang.NoClassDefFoundError: org/apache/log4j/Priority的问题解决
    yml中driver-class-name: com.mysql.jdbc.Driver 解析不到的问题
    docker 操作镜像的基本操作
    Navicat 远程连接Docker容器中的mysql 报错:1251
    spring boot中常用的配置文件的重写
    MVC最全jar包
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/5263181.html
Copyright © 2011-2022 走看看