📅  最后修改于: 2023-12-03 15:12:19.185000             🧑  作者: Mango
在编写 C++ 程序时,常常需要与 cmd 命令交互,例如执行系统命令、获取命令行参数、输出数据到控制台等。本文将介绍如何在 C++ 中运行 cmd 命令。
system
函数可以在 C++ 程序中运行任意系统命令,其原型为:
int system(const char* command);
其中,command
参数为要执行的命令字符串。例如,要在 cmd 中执行 dir
命令,并输出结果到控制台,可以写出如下代码:
#include <iostream>
#include <cstdlib>
using namespace std;
int main () {
system("dir");
return 0;
}
上述代码中,system
函数的返回值为执行 cmd 命令的结果。在 Windows 中,其返回值为命令执行后的返回值,通常为 0 表示执行成功。如果执行 cmd 命令时需要传入参数,只需将命令字符串组合好即可。
需要注意的是,由于 system 函数相当于在 C++ 程序中调用了 cmd 命令,因此存在一定的安全风险。尤其是在处理用户输入时,应该对输入内容进行过滤和验证,以避免系统命令被恶意注入。
popen
函数可以创建一个管道,使 C++ 程序可以与 cmd 命令进行交互。其原型为:
FILE* popen(const char* command, const char* mode);
其中,command
参数为要执行的命令字符串,mode
参数为打开管道的模式,一般为 "r" 或 "w"。例如,要在 cmd 中执行 dir
命令,并读取输出结果,可以写出如下代码:
#include <iostream>
#include <cstdio>
using namespace std;
int main () {
FILE *fp = popen("dir", "r");
char buffer[1024];
while (fgets(buffer, 1024, fp)) {
cout << buffer;
}
pclose(fp);
return 0;
}
上述代码中,popen
函数返回的是一个 FILE 指针,可以像操作文件一样使用 fgets
函数读取输出结果。pclose
函数用于关闭管道。需要注意的是,popen
函数返回的 FILE 指针只能读写一个方向,如果要进行双向交互,需要同时打开两个管道。
CreateProcess
函数可以创建一个新的进程,并执行指定命令,其原型为:
BOOL CreateProcess(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
其中,lpCommandLine
参数为要执行的命令字符串。例如,要在 cmd 中执行 dir
命令,并读取输出结果,可以写出如下代码:
#include <iostream>
#include <windows.h>
using namespace std;
int main () {
HANDLE hReadPipe, hWritePipe;
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;
CreatePipe(&hReadPipe, &hWritePipe, &sa, 0);
SetHandleInformation(hReadPipe, HANDLE_FLAG_INHERIT, 0);
STARTUPINFO si;
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.hStdError = hWritePipe;
si.hStdOutput = hWritePipe;
si.dwFlags |= STARTF_USESTDHANDLES;
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
CreateProcess(NULL, "cmd /c dir", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
CloseHandle(hWritePipe);
WaitForSingleObject(pi.hProcess, INFINITE);
char buffer[1024];
DWORD bytesRead;
while (ReadFile(hReadPipe, buffer, 1024, &bytesRead, NULL)) {
if (bytesRead == 0) break;
buffer[bytesRead] = '\0';
cout << buffer;
}
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
CloseHandle(hReadPipe);
return 0;
}
上述代码中,使用 CreatePipe
函数创建进程间通信管道,并将标准输出和标准错误输出都重定向到管道中,然后通过 CreateProcess
函数创建一个新的 cmd 进程并执行命令。通过 ReadFile
函数读取管道输出,并输出到控制台中。最后需要关闭相关句柄。
需要注意的是,CreateProcess
函数可以指定一系列参数来精细控制进程的创建和执行,详细参数可以查看官方文档。
本文介绍了三种在 C++ 程序中运行 cmd 命令的方法,包括使用 system 函数、popen 函数和 CreateProcess 函数。这些方法可以方便地实现与操作系统交互和控制台程序的调用。在使用这些方法时需要注意安全性和效率问题,避免恶意攻击和程序崩溃。