我正在尝试使用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)
我正在尝试使用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的另一个好处:它们不需要硬编码路径或默认命令提示环境(即路径)的特殊知识.