我正在尝试使用C中的system()
调用来探索我们可以做的事情。
以下是我用来关闭机器的代码。它适用于Windows XP,但在Windows 7中启动时无法在我的机器上运行。问题一定是什么?
我在openSUSE 11.3上尝试了system("shutdown -R Now")
,它在那里工作正常。是什么导致这个平台问题在这里?我对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;
}
答案 0 :(得分: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;
}
当然,就像使用shutdown.exe
调用system
一样,应用程序需要适当的权限才能启动系统关闭。简单来说,您需要使用管理权限运行应用程序。 Like David suggests,来自提升的命令提示符。如果您感兴趣,ExitWindowsEx
函数的链接文档会提供有关安全模型的更多详细信息。
明显的批评是ExitWindowsEx
是特定于平台的。您无法在基于Unix的计算机上调用此函数,因为它未实现。您需要调用相应的POSIX API(或者您平台上的任何API)。如果您真的想编写与平台无关的代码,那么您需要使用检测目标操作系统的条件编译(即#if
语句)并调用相应的API,这很难看。
问题是,system
函数具有完全相同的限制。您传递的任何参数都会被执行,就好像您已将它们键入命令行一样。并且不同操作系统中的命令行环境非常不同。如果Windows和其他一些操作系统都有shutdown
命令,那简直是巧合。即便如此,它也不可能完全相同。所以你仍然留下丑陋的平台相关代码。您也可以调用正确的系统API。
system
函数的主要用途是它允许您从自己的应用程序启动另一个应用程序。但也有一个API函数:CreateProcess
。它更强大,接受各种参数来精确控制启动的进程应该如何表现。最重要的是,它提供了一种报告和处理错误的标准化方法。
哦,而且,硬编码路径始终是错误的,无论您使用的是system
,CreateProcess
还是低批处理文件。系统驱动器可能不是“C”。 Windows可能未安装在名为“Windows”的目录中。等等。这是调用适当的OS API的另一个好处:它们不需要硬编码路径或默认命令提示环境(即路径)的特殊知识。
答案 1 :(得分:1)
for Windows XP使用
system("C:\\WINDOWS\\System32\\shutdown -s");
for Windows 7
system("C:\\WINDOWS\\System32\\shutdown /s");
表示Ubuntu
system("shutdown -P now");
如果您使用的是Turbo C编译器,则从文件夹中执行您的文件。按F9从源程序构建可执行文件。按ctrl + F9从编译器中运行时可能无效。