java实时获取linux的us和sy_windows和Linux程序读取命令输出信息

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

一、windows程序读取命令输出信息

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 的形式,这样将标准错误也读进来。

二、Linux程序读取命令输出信息

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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值