使用C关闭系统不起作用

3 c windows shutdown

我正在尝试使用system()C语言调用我们可以做的事情.以下是我用来关闭我的机器的代码.它适用于Windows XP,但在Windows 7中启动时无法在我的机器上运行.问题一定是什么?我试过system("shutdown -R Now")openSUSE 11.3,它在那里工作正常.是什么导致这个平台问题在这里?我对system()相关的例程并不熟悉.

#include <stdio.h>
#include <stdlib.h>

int main(void)    
{    
   char ch;    

   printf("Do you want to shutdown your computer now (y/n)\n");    
   scanf("%c",&ch);    

   if (ch == 'y' || ch == 'Y')    
      system("C:\\WINDOWS\\System32\\shutdown -s");    

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

Cod*_*ray 7

我正在尝试使用C中的system()调用来探索我们可以做的事情.

无需探索:您可以从命令行执行任何操作.您传递给的任何参数system基本上都是在命令行中"键入"的.但这正是为什么你要不惜一切代价避免这个功能的原因!这是不安全的,它很慢,没有可靠的方法来处理错误,而且几乎总有更好的方法来实现你想要的东西.

这种情况就是一个很好的例子.使用system调用shutdown.exe不是以编程方式关闭Windows的正确方法.有一个API调用:ExitWindowsEx.该uFlags参数用于指示您是否希望系统注销拥有调用该功能的进程的用户,重新启动系统或关闭系统电源.

你在C中使用它是这样的:

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>  // need this to call Windows APIs

int main(void)    
{    
   char ch;    

   printf("Do you want to shutdown your computer now (y/n)\n");    
   scanf("%c",&ch);    

   if (ch == 'y' || ch == 'Y')
      ExitWindowsEx(EWX_POWEROFF, 0);

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

当然,就像调用shutdown.exeusing一样system,应用程序需要适当的权限才能启动系统关闭.简单来说,您需要使用管理权限运行应用程序.像大卫建议的那样,从提升的命令提示.ExitWindowsEx如果您感兴趣,该函数的链接文档会提供有关安全模型的更多详细信息.

显而易见的批评是ExitWindowsEx特定于平台的.您无法在基于Unix的计算机上调用此函数,因为它未实现.您需要调用相应的POSIX API(或者您平台上的任何API).如果您真的想编写与平台无关的代码,那么您需要使用#if检测目标操作系统的条件编译(即语句)并调用相应的API,这很丑陋.

问题是,该system功能具有完全相同的限制.您传递的任何参数都会被执行,就好像您已将它们键入命令行一样.并且不同操作系统中的命令行环境非常不同.如果Windows和其他一些操作系统都有shutdown命令,那简直是巧合.即便如此,它也不可能完全相同.所以你仍然留下丑陋的平台相关代码.您也可以调用正确的系统API.

system功能的主要用途是允许您从自己的应用程序启动另一个应用程序.但是也有一个API函数:CreateProcess.它更强大,接受各种参数来精确控制启动的进程应该如何表现.最重要的是,它提供了一种报告和处理错误的标准化方法.

哦,还有,硬编码路径永远是错的,不管你是使用system,CreateProcess或卑微的批处理文件.系统驱动器可能不是"C".Windows可能未安装在名为"Windows"的目录中.等等.这是调用适当的OS API的另一个好处:它们不需要硬编码路径或默认命令提示环境(即路径)的特殊知识.