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

当然你也可以直接调用system("reboot"),但是这里完全基于库函数来实现,不依赖于/sbin/reboot这个外部程序

这里

reboot()的其他命令

,比如RB_POWER_OFF,并不能保证关闭计算机电源.

#include

#include

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

/* 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

#include

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

#include

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值