c语言代码 linux 关机_linux下c程序调用reboot函数实现直接重启【转】

这篇博客介绍了如何在Linux系统中使用C语言调用reboot()函数来实现系统的直接重启,而非依赖于外部/sbin/reboot程序。主要内容包括reboot函数的使用方法,宏定义以及相关头文件sys/reboot.h中的常量定义。
摘要由CSDN通过智能技术生成

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)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值