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

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

一、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程序读取命令输出信息

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

  循环读取内容 
  //等待时间到达或进程退出,进程不退出将一直读取管道数据(每隔dTimeOut读取一次)
	while (WAIT_TIMEOUT == WaitForSingleObject(pi.hProcess, dTimeOut))
	{
		// 预览管道中数据的内容
		if (!PeekNamedPipe(m_hPipeRead, NULL, 0, NULL, &dwReadLen, NULL)
			|| dwReadLen <= 0)
		{
			continue;
		}
		else
		{
			ZeroMemory(m_szPipeOut, sizeof(m_szPipeOut));
			// 读取管道中的数据
			if (ReadFile(m_hPipeRead, m_szPipeOut, dwReadLen, &dwStdLen, NULL))
			{
				//读取内容数据
                //fwrite(m_szPipeOut,1,dwStdLen,fp);
                //fflush
			}
			else
			{
				m_dwErrorCode = GetLastError();
				break;
			}
		}
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

byxdaz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值