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;
- }
相关推荐
吹云 2020-11-05
84407805 2020-11-01
曾是土木人 2020-10-31
87201442 2020-10-15
java0 2020-09-29
81437716 2020-09-18
81437716 2020-09-13
bluecarrot 2020-09-11
myCat 2020-09-09
83427718 2020-09-07
85560694 2020-09-03
89520991 2020-08-21
89550191 2020-08-09
katie000 2020-08-04
hunningtu 2020-07-30
89961330 2020-07-28
yuzhongdelei0 2020-07-28
yuzhongdelei0 2020-07-27