在C语言中调用DOS命令(Windows系统下通常称为命令提示符或CMD命令)可以通过系统提供的接口实现,主要方法包括使用system()函数、_spawn系列函数以及CreateProcess API等,以下是详细的实现方式、代码示例及注意事项。

使用system()函数调用DOS命令
system()是C标准库中提供的函数,位于stdlib.h头文件中,可以直接执行操作系统命令,其原型为int system(const char *command),参数command为要执行的DOS命令字符串,函数返回命令执行的状态码。
示例代码:
#include <stdio.h>
#include <stdlib.h>
int main() {
// 执行DOS命令:列出当前目录的文件
int result = system("dir");
if (result == -1) {
perror("system调用失败");
return 1;
}
printf("命令执行状态码: %d\n", result);
return 0;
}
优点:
- 简单易用,无需复杂配置。
- 支持所有DOS命令,如
dir、copy、ping等。
缺点:
- 无法获取命令的输出结果,仅能获取执行状态码。
- 安全性较低,若命令字符串来自用户输入,可能存在命令注入风险。
使用_spawn系列函数调用DOS命令
_spawn系列函数(如_spawnlp、_spawnvp)位于process.h头文件中,可以创建并执行新的进程,适合需要更精细控制的场景。
示例代码:
#include <stdio.h>
#include <process.h>
int main() {
// 使用_spawnlp执行DOS命令
int result = _spawnlp(_P_WAIT, "dir", "dir", NULL);
if (result == -1) {
perror("_spawnlp调用失败");
return 1;
}
printf("命令执行状态码: %d\n", result);
return 0;
}
优点:
- 可以指定进程的执行方式(如等待或异步)。
- 相比
system(),安全性更高。
缺点:
- 需要手动处理命令路径和参数。
- 仍无法直接获取命令输出。
使用CreateProcess API调用DOS命令
CreateProcess是Windows提供的API,功能强大,可以完全控制子进程的创建和输入输出,需要包含windows.h头文件。
示例代码:
#include <windows.h>
#include <stdio.h>
int main() {
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
// 执行DOS命令:ping www.baidu.com
if (!CreateProcess(
NULL, // 使用命令行
"ping www.baidu.com", // 命令字符串
NULL, // 默认进程属性
NULL, // 默认线程属性
FALSE, // 不继承句柄
0, // 默认创建标志
NULL, // 使用父进程环境变量
NULL, // 使用父进程工作目录
&si, // 启动信息
&pi)) { // 进程信息
printf("CreateProcess失败 (%d)\n", GetLastError());
return 1;
}
// 等待进程结束
WaitForSingleObject(pi.hProcess, INFINITE);
// 关闭句柄
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
}
优点:
- 完全控制子进程的输入输出(通过重定向管道)。
- 支持异步执行和高级进程管理。
缺点:
- 代码复杂,仅适用于Windows平台。
- 需要处理句柄和错误码。
通过管道获取命令输出
若需要获取DOS命令的输出结果,可以使用管道(Pipe)结合CreateProcess实现,以下是示例代码:

#include <windows.h>
#include <stdio.h>
int main() {
HANDLE hReadPipe, hWritePipe;
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;
// 创建管道
if (!CreatePipe(&hReadPipe, &hWritePipe, &sa, 0)) {
printf("创建管道失败\n");
return 1;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
si.hStdOutput = hWritePipe;
si.dwFlags |= STARTF_USESTDHANDLES;
ZeroMemory(&pi, sizeof(pi));
// 执行命令并重定向输出
if (!CreateProcess(NULL, "ipconfig", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) {
printf("CreateProcess失败\n");
return 1;
}
// 读取管道输出
char buffer[1024];
DWORD bytesRead;
while (ReadFile(hReadPipe, buffer, sizeof(buffer) - 1, &bytesRead, NULL) && bytesRead > 0) {
buffer[bytesRead] = '\0';
printf("%s", buffer);
}
// 关闭句柄
CloseHandle(hReadPipe);
CloseHandle(hWritePipe);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
}
注意事项
- 安全性:避免直接拼接用户输入到命令字符串中,防止命令注入攻击。
- 平台兼容性:
system()和_spawn在Linux/Unix下可用,但CreateProcess仅限Windows。 - 资源释放:使用
CreateProcess后务必关闭句柄,避免内存泄漏。
相关问答FAQs
Q1: 如何在C语言中获取DOS命令的输出结果?
A: 可以通过管道(Pipe)结合CreateProcess API实现,具体步骤包括:创建管道、设置子进程的标准输出重定向到管道、读取管道数据,示例代码见上文第四部分。
Q2: system()函数和CreateProcess有什么区别?
A: system()是跨平台的简单接口,适合快速执行命令,但无法获取输出或精细控制;CreateProcess是Windows专用API,功能强大,支持进程管理、输入输出重定向等,但代码复杂度较高。

