当前位置: 代码迷 >> 综合 >> windows和Linux程序读取命令输出信息
  详细解决方案

windows和Linux程序读取命令输出信息

热度:10   发布时间:2024-02-08 18:23:15.0

       linux中通过popen读取命令输出信息。要通过管道来完成的。首先用popen打开一个命令行的管道,然后通过fgets获得该管道传输的内容,也就是命令行运行的结果。window中 要用CreateProcessW函数来启动新的进程,以便执行cmd命令。

一、windows程序读取命令输出信息

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 的形式,这样将标准错误也读进来。

二、Linux程序读取命令输出信息

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 -2;   }   else if (!strnicmp(buffer,"No such file:",strlen("No such file:"))) //找不到制定文件   {   //TRACE(buffer);   return -1;   }   if (strlen(buffer)<32)                                              //获得结果小于32位,说明没有得到md5值   {   //TRACE(buffer);   return false;   }   strncpy(MD5key, buffer, 32);                                        //获得md5值成功   strcat(MD5key, "\0");   return TRUE;   
}  

 

  相关解决方案