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 error\n", ps);        }    }  

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

在windows上相对要麻烦些,需要用CreateProcessW函数来启动新的进程,以便执行cmd命令。windows下的例子请看这个调用md5sum.exe来获得文件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"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;    }  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwxfwp.html