C语言获得命令行输出结果

阅读: 评论:0

C语言获得命令行输出结果

C语言获得命令行输出结果

在c程序中,system函数可以运行命令行,但是只能得到该命令行的int型返回值,并不能获得显示结果。例如system(“ls”)只能得到0或非0,如果要获得ls的执行结果,则要通过管道来完成的。首先用popen打开一个命令行的管道,然后通过fgets获得该管道传输的内容,也就是命令行运行的结果

在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 errorn", ps);   }   
}  

在这段代码中,参数cmd为要执行的命令行,result为命令行运行结果。输入的cmd命令最好用… 2>&1 的形式,这样将标准错误也读进来

在windows上相对要麻烦些,需要用CreateProcessW函数来启动新的进程,以便执行cmd命令。windows下的例子请看这个调用来获得文件md5值的代码:

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&# /c md5sum "%s" ",szfilenameW);       //给出命令行信息   //eg:  /c md5sum ""   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, "");   return TRUE;   
}  

————————————————
版权声明:本文为CSDN博主「Yuk丶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:

本文发布于:2024-02-04 16:52:38,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170712095757530.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:命令   语言   行输出
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23