转自: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

linux下c程序调用reboot函数实现直接重启【转】的更多相关文章

  1. Linux下C程序的编辑,编译和运行以及调试

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...

  2. Linux平台下Java调用C函数

    JNI是Java native interface的简写,可以译作Java原生接口.Java可以通过JNI调用C/C++的库,这对于那些对性能要求比较高的Java程序无疑是一个 福音. 使用JNI也是 ...

  3. 位图文件(BMP)格式以及Linux下C程序实现(转)

    源:位图文件(BMP)格式以及Linux下C程序实现 说到图片,位图(Bitmap)当然是最简单的,它是Windows显示图片的基本格式,其文件扩展名为*.BMP.由于没有经过任何的压缩,故BMP图 ...

  4. 在linux下sh批处理文件调用java的方法

    解密 java -classpath collection-impl-0.0.1.jar com.ai.toptea.collection.message.DESEncrypt 1EFE4663895 ...

  5. Delphi - Windows系统下,Delphi调用API函数和7z.dll动态库,自动把文件压缩成.tar.gz格式的文件

    项目背景 应欧美客户需求,需要将文件压缩成.tar.gz格式的文件,并上传给客户端SFTP服务器. 你懂的,7-Zip软件的显著特点是文件越大压缩比越高,在Linux系统上相当于我们Windows系统 ...

  6. Linux下C程序的内存映像

    2.Linux下C程序的内存映像 2.1. 代码段.只读数据段(1)对应着程序中的代码(函数),代码段在Linux中又叫文本段(.text)(2)只读数据段就是在程序运行期间只能读不能写的数据,con ...

  7. Linux下C程序内存泄露检测

    在linux下些C语言程序,最大的问题就是没有一个好的编程IDE,当然想kdevelop等工具都相当的强大,但我还是习惯使用kdevelop工具,由于没有一个习惯的编程IDE,内存检测也就成了在lin ...

  8. Linux 下使用C语言 gets()函数报错

    在Linux下,使用 gets(cmd) 函数报错:warning: the 'gets' function is dangerous and should not be used. 解决办法:采用 ...

  9. Linux下远程备份、上传工程,重启服务器

    Linux下远程备份.上传工程,重启服务器 Linux服务器实现远程,原项目的备份.删除,新项目上传,以及远程重启服务器!分成一个主shell调用三个shell文件步骤完成.mainsh.sh一次按顺 ...

随机推荐

  1. jsp或Action获取请求参数中文乱码

    普通情况下,中文字符会被自动转换成iso-8859-1的编码格式通过网络传输,而这种格式是没办法直接表示出我们认识的中文字符的,所以还要手动将他转换回之前的字符集. 一般在servlet或者actio ...

  2. Invalid object name ‘sys.configurations’. (Microsoft SQL Server, Error: 208)

    http://blogs.msdn.com/b/ramaprasanna/archive/2009/09/16/invalid-object-name-sys-configurations-micro ...

  3. W3C和IE中的事件处理函数

    在上一篇文章中提到了关于传统的JS中注册事件对象的一些缺点和问题,下面是关于DOM2级的现代事件绑定.本文中设计到的HTML文件在文章最后 一.W3C事件处理函数 “DOM2 级事件”定义了两个方法, ...

  4. 【BZOJ】【1047】【HAOI2007】理想的正方形

    DP/单调队列优化 一眼看上去就是DP 我想的naive的二维DP是酱紫滴: mx[i][j][k]表示以(i,j)为右下角的k*k的正方形区域内的最大值,mn[i][j][k]同理 mx[i][j] ...

  5. SQLSERVER中WITH(NOLOCK)详解

    在查询语句中使用 NOLOCK 和 READPAST 处理一个数据库死锁的异常时候,其中一个建议就是使用 NOLOCK 或者 READPAST .有关 NOLOCK 和 READPAST的一些技术知识 ...

  6. 对drupal的理解【转】

    写本文是想跟刚用drupal的朋友,分享一下心得,国内用drupal的太少了,希望大家能好好交流. 希望几分钟看完后你能马上上手drupal,至少能理解hook,api,theme,module,cc ...

  7. HDU 2671 Can't be easier(数学题,点关于直线对称)

    题目 //数学题//直线 y = k * x + b//直线 ax+by+c=0; 点 (x0,y0); 点到直线距离 d = (ax0+by0+c)/sqrt(a^2+b^2) /********* ...

  8. (转)Maximum subarray problem--Kadane’s Algorithm

    转自:http://kartikkukreja.wordpress.com/2013/06/17/kadanes-algorithm/ 本来打算自己写的,后来看到上述链接的博客已经说得很清楚了,就不重 ...

  9. 就地交叉数组元素[a1a2b1b2]->[a1b1a2b2]

    问题描述: If [a1,a2,a3...,an,b1,b2...bn] is given input change this to [a1,b1,a2,b2.....an,bn] , solutio ...

  10. 安装mysql之后,存入中文出现乱码

    如图显示:安装mysql之后,存入中文出现乱码 解决方案: 找到如图的文件位置 打开进行如图的修改: 结果: