windows和Linux程序读取命令输出信息
Posted byxdaz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了windows和Linux程序读取命令输出信息相关的知识,希望对你有一定的参考价值。
linux中通过popen读取命令输出信息。要通过管道来完成的。首先用popen打开一个命令行的管道,然后通过fgets获得该管道传输的内容,也就是命令行运行的结果。window中 要用CreateProcessW函数来启动新的进程,以便执行cmd命令。
一、linux程序读取命令输出信息
void executeCMD(const char *cmd, char *result)
char buf_ps[1024];
char ps[1024]=0;
FILE *ptr;
strcpy(ps, cmd);
if((ptr=popen(ps, "r"))!=NULL)
while(fgets(buf_ps, 1024, ptr)!=NULL)
strcat(result, buf_ps);
if(strlen(result)>1024)
break;
pclose(ptr);
ptr = NULL;
else
printf("popen %s error\\n", ps);
在这段代码中,参数cmd为要执行的命令行,result为命令行运行结果。输入的cmd命令最好用... 2>&1 的形式,这样将标准错误也读进来。
二、windows程序读取命令输出信息
int GetFileMD5W(const TCHAR *filefullpath, char *MD5key)
TCHAR szfilenameW[MAX_PATH_LENGTH]=0; //保存文件名
TCHAR szFilePathW[MAX_PATH_LENGTH]=0; //保存路径
TCHAR szCmdLineW[MAX_PATH_LENGTH]=0; //保存命令行信息
char buffer[MAX_PATH_LENGTH] = 0; //保存命令行输出
TCHAR *pos=NULL;
DWORD bytesRead = 0;
if (wcslen(filefullpath)>MAX_PATH_LENGTH)
return false;
wcscpy(szFilePathW, filefullpath);
int i=0;
while (szFilePathW[i]!=0)
if (szFilePathW[i]==_T('/'))
szFilePathW[i]=_T('\\\\');
i++;
if ((pos=wcschr(szFilePathW, '\\\\'))==NULL) //找到文件路径最右边的'\\'
return false;
wcscpy(szfilenameW, pos+1); //获得文件名
*pos=0; //获得文件所在路径
if (wcslen(szfilenameW)==0 || wcslen(szFilePathW)==0 || MD5key==NULL) //检查文件名或路径大小是否合适
return false;
wsprintf(szCmdLineW,L"cmd.exe /c md5sum \\"%s\\" ",szfilenameW); //给出命令行信息
//eg: cmd.exe /c md5sum "for text.txt"
SECURITY_ATTRIBUTES sa = 0;
HANDLE hRead = NULL, hWrite = NULL; //设置管道读写句柄
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if (!CreatePipe(&hRead, &hWrite, &sa,0)) //创建管道
return false;
STARTUPINFO si = 0;
PROCESS_INFORMATION pi = 0;
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite; //
si.hStdOutput = hWrite; //
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
//关键步骤,CreateProcess函数参数意义请查阅MSDN
if (!CreateProcessW(NULL, szCmdLineW
,NULL,NULL,TRUE,NULL,NULL,szFilePathW,&si,π)) //注意,这里将szFilePathW(文件所在路径)作为倒数第三个参数
CloseHandle(hWrite);
CloseHandle(hRead);
return false;
WaitForSingleObject(pi.hProcess,INFINITE); //等待md5sum结束
// Close process and thread handles.
CloseHandle(pi.hProcess); //关闭新进程的主线程
CloseHandle(pi.hThread); //关闭新进程
CloseHandle(hWrite); //关闭管道的写句柄
ReadFile(hRead, buffer, MAX_PATH_LENGTH, &bytesRead, NULL); //从管道中读取md5sum的运行结果
CloseHandle(hRead); //关闭管道的读句柄
if (NULL!=strstr(buffer,"md5sum")) //如果运行结果中出现了md5sum,多半是执行失败
//TRACE(buffer);
return false;
else if (!strnicmp(buffer,"No such file:",strlen("No such file:"))) //找不到制定文件
//TRACE(buffer);
return false;
if (strlen(buffer)<32) //获得结果小于32位,说明没有得到md5值
//TRACE(buffer);
return false;
strncpy(MD5key, buffer, 32); //获得md5值成功
strcat(MD5key, "\\0");
return true;
循环读取内容
//等待时间到达或进程退出,进程不退出将一直读取管道数据(每隔dTimeOut读取一次)
while (WAIT_TIMEOUT == WaitForSingleObject(pi.hProcess, dTimeOut))
// 预览管道中数据的内容
if (!PeekNamedPipe(m_hPipeRead, NULL, 0, NULL, &dwReadLen, NULL)
|| dwReadLen <= 0)
continue;
else
ZeroMemory(m_szPipeOut, sizeof(m_szPipeOut));
// 读取管道中的数据
if (ReadFile(m_hPipeRead, m_szPipeOut, dwReadLen, &dwStdLen, NULL))
//读取内容数据
//fwrite(m_szPipeOut,1,dwStdLen,fp);
//fflush
else
m_dwErrorCode = GetLastError();
break;
以上是关于windows和Linux程序读取命令输出信息的主要内容,如果未能解决你的问题,请参考以下文章
QProcess -> 在 Linux 上从 sftp 读取标准输出