LINUX C获取命令行输出结果 |
您所在的位置:网站首页 › linux获取文件的刷新时间并输出信息 › LINUX 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 的形式,这样将标准错误也读进来
这次的项目中更要获取U盘设备的名称,网上搜到可以使用blkid命令,执行blkid命令结果如下: /dev/sda1: UUID="157b922d-8f42-4514-a2f0-f31eb7ceae68" TYPE="ext4" /dev/sda2: UUID="0e69206a-03eb-498c-a1d3-46c5b2f9d0cc" TYPE="ext4" /dev/sda3: UUID="7dc1e588-6794-490f-b315-1af7e1fcbdae" TYPE="swap" /dev/sdb1: UUID="54f1d622-572e-41d6-b177-58a4369ef38f" TYPE="ext3" /dev/sdc1: UUID="B653-1BCA" TYPE="vfat" 最后一行即为U盘的信息。 在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) |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |