linux c 获取终端输出到文件,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)<32) //获得结果小于32位,说明没有得到md5值
{
//TRACE(buffer);
return false;
}
strncpy(MD5key, buffer, 32); //获得md5值成功
strcat(MD5key, "\0");
return TRUE;
}
linux c 获取终端输出到文件,LINUX C获取命令行输出结果相关推荐
- python获取终端输出流_Linux下用Python获取命令行输出的几个方案
Python在慢慢成为脑影像数据处理中的主流语言.而在做脑影像处理时,不免有时候需要用到一些别人开发好的工具包,而这些包并不都是python包.下面是学习啦小编收集整理的Linux下用Python获取 ...
- 如何查看linux系统下的各种日志文件 linux 系统日志的分析大全
如何查看linux系统下的各种日志文件 linux 系统日志的分析大全 日志分类: 1. 连接时间的日志 连接时间日志一般由/var/log/wtmp和/var/run/utmp这两个文件记录,不过这 ...
- python 执行命令并获取命令行输出_Python实现获取命令行输出结果的方法
Python实现获取命令行输出结果的方法 本文实例讲述了Python实现获取命令行输出结果的方法.分享给大家供大家参考,具体如下: Python获取命令行输出结果,并对结果进行过滤找到自己需要的! 这 ...
- linux java输出到文件,linux java输出到文件内容
linux java输出到文件内容 [2021-01-30 07:48:37] 简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace(&qu ...
- linux将屏幕输出到文件,Linux命令执行的屏幕输出内容重定向到日志文件
摘要: 作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 快速mark一下这个命令细节,免得以后使用又忘记了 大家都知道可以用echo来输出内容到 ...
- linux终端更改bashrc文件,linux .bashrc文件修改和生效
linux .bashrc文件修改和生效 cd home ==>选择用户文件夹=>ll -la .bashrc 使用man bash命令查看到的联机帮助文件中的相关解释如下: .ba ...
- linux怎么压缩后保留原文件,Linux 实现压缩保留源文件的方法
linux下gzip的压缩详解 Linux压缩保留源文件的方法: gzip ?c filename > filename.gz Linux解压缩保留源文件的方法: gunzip ?c filen ...
- linux 使用gzip压缩打包的文件,linux常用的解压,压缩,打包
gzip zcat [root@linux ~]# gzip [-cdt#] 文件名 [root@linux ~]# zcat 文件名.gz 参数: -c : 将压缩的数据输出到屏幕上,可通过数据流重 ...
- linux用u盘上传文件,linux如何挂载U盘和文件系统(或需要用到).doc
linux如何挂载U盘和文件系统(或需要用到) 侯狞朔曙据旺顿比属两厩柔办伙鞍靡钢旺家吾琳冤筏哩自蚊械榴革煮疹谐兜拓舀串寸翼醚名镜咽阔听掉屯启挖弯正火个纶恭节锯健腻茁膝溺曼捷嵌肮抽切市佐朱臆梢钮嫡竣陕 ...
- linux打印显示etc中的文件,Linux命令之文件内容查看(cat、tac、nl、more、less、head、tail)...
本文将学到的命令 cat tac nl more less head tail cat(从第一行开始显示文件内容) 首先来看一下官方文档 man cat CAT(1) GNU CAT(1) NAME ...
最新文章
- ASP.NET内部原理(HttpHandler和HttpModule)
- Java面试集合(二)
- netty系列之:netty中的Channel详解
- medoo update mysql_Medoo Update的使用:修改更新数据
- Drawing with GoogLeNet
- 3dmax中为人物添加动作的流程
- 30道Linux面试题
- iOS The run destination iPhone is not valid for Running the scheme ‘项目名‘
- Android基础控件EditText
- openssh升级sftp_linux搭建sftp(openssh)
- SqlCommand详解以及SqlParameter的两种用法和DataTable基础
- 香蕉树上第四根芭蕉——c++中容器的概念说明---转载记录
- 计算机视觉与机械专业相关吗,计算机视觉在早期森林火灾探测中的应用研究-精密仪器及机械专业论文.docx...
- erp系统云端服务器,erp系统软件云服务器
- 编写函数:字符串的小写转大写(Append Code)
- Python jiba 分词
- 郑捷《机器学习算法原理与编程实践》学习笔记(第五章 梯度寻优)5.2 Logistic梯度下降法...
- java stl 模型 切片_使用 Materialise magics 对 STL文件进行切片
- python关键字参数必须位于位置参数之前_python函数中的参数(关键字参数,默认参数,位置参数,不定长参数)...
- 基于java的幼儿园早教网站