09月22日, 2014 101次
有网友碰到过这样的linux下如何在C程序中获取到脚本执行的结果,问题详细内容为:linux下如何在C程序中获取到脚本执行的结果,我搜你通过互联网收集了相关的一些解决方案,希望对有过相同或者相似问题的网友提供帮助,具体如下:解决方案1:用popen本回答被提问者采纳
用popen 本回答被提问者采纳
? 脂本系统? 重要译本
void executeShell(const char *shell){ FILE *stream; char buf[1024]; memset( buf, '\0', sizeof(buf) );//初始化buf,以免后面写如乱码到文件中 stream = popen( shell , "r" ); //将命令的输出 通过管道读取(“r”参数)到FILE* stream fread( buf, sizeof(char), sizeof(buf), stream); //将刚刚FILE* stream的数据流读取到buf中 pclose( stream ); printf("%s \n",buf);//打印输出结果}
直接在C文件里调用system就可以了。#include <stdio.h>int main(int argc, char *argv[]){ system("ifconfig"); return 0;}编译执行就能在终端中输出ifconfig命令的结果。man system看看。 shell脚本才会用到重定向。
ifconfig的默认输出就是终端输出,只有你不需要终端输出的时候才会使用重定向,一般的重定向是文件重定向,两个符号,>>(append模式0) , >(一般模式)。管道是 | 符号,和重定向不同。
你要获取什么,ifconfig命令是获取当前主机的IP地址等信息,可以直接在终端命令行输入,例如akaedu@akaedu-desktop:~/jwy/baidu/str$ ifconfigeth0 Link encap:以太网 硬件地址 00:1f:d0:c4:91:92 inet 地址:192.168.1.155 广播:192.168.1.255 掩码:255.255.255.0 inet6 地址: fe80::21f:d0ff:fec4:9192/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1 接收数据包:37932 错误:0 丢弃:0 过载:0 帧数:0 发送数据包:23506 错误:0 丢弃:0 过载:0 载波:0 碰撞:0 发送队列长度:1000 接收字节:49613893 (49.6 MB) 发送字节:2359948 (2.3 MB) 中断:26 基本地址:0x4000 lo Link encap:本地环回 inet 地址:127.0.0.1 掩码:255.0.0.0 inet6 地址: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 跃点数:1 接收数据包:116 错误:0 丢弃:0 过载:0 帧数:0 发送数据包:116 错误:0 丢弃:0 过载:0 载波:0 碰撞:0 发送队列长度:0 接收字节:9772 (9.7 KB) 发送字节:9772 (9.7 KB) 追问 用c实现一个程序,运行这个程序输出ifconfig结果 追答 你要的函数功能实现起来有点麻烦,下面的链接代码可以实现部分显示,我运行过,最下面是运行截图,不知道是不是你要的代码,有500多行。链接:http://hi.baidu.com/zengzhaonong/blog/item/30836c8d9329cb19b31bba8f.html截图如下: 本回答被提问者采纳
您可以试下类似的代码,popen 函数在 vc6 中对应的应该是 _popen ,pclose 为 _pclose或者百度 “c++ 获取 system 的输出” 您可以得到很多类似的问题的解决方案。#include <stdio.h>#include <string>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); }}int main(){ char result[1024]; executeCMD("find . -name \"A.txt\"", result); printf("%s", result ); return 0;}
popen,可以执行一个进程,其反回一个文件指针,就可以读取进程执行的结果!#include <stdio.h>#include <stdlib.h>#include <string.h>int main(){ FILE *pf = popen("ls ./", "r"); char res[1024]; fread(res, 1024, 1, pf); printf("----%s---\n", res); pclose(pf); return 0;} 本回答被提问者采纳
在windows下面这个的确是需要用管道来实现的VC6参考代码:#include <windows.h>#include <stdio.h>BOOL ExcudeCmd(char *szOutPutBuf,char *szCmdLine){ SECURITY_ATTRIBUTES sa; HANDLE hRead,hWrite; sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; //输出重定向 if (!CreatePipe(&hRead,&hWrite,&sa,0)) { printf("创建匿名管道失败"); return FALSE; } STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si,sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); si.hStdInput=hRead; si.hStdError = GetStdHandle(STD_ERROR_HANDLE); //把创建进程的标准错误输出重定向到管道输入 si.hStdOutput = hWrite; //把创建进程的标准输出重定向到管道输入 si.wShowWindow = SW_HIDE; si.dwFlags =STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; if (!CreateProcess(NULL, szCmdLine,NULL,NULL,TRUE,0,NULL,NULL,&si,&pi)) { CloseHandle(hWrite); CloseHandle(hRead); printf("创建子进程失败"); return FALSE; } else { CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } DWORD bytesRead; if (!ReadFile(hRead,szOutPutBuf,1000,&bytesRead,NULL)) { printf("读数据失败"); return FALSE; } CloseHandle(hRead); return TRUE;}int main(){ char cmdline[]="cmd.exe /c echo 回显的信息",buf[1000]; ZeroMemory(buf,100); ExcudeCmd(buf,cmdline); printf(buf);//buf就是你想要的东西}Linux下面就不清楚了
示意流程如下: return_code = system("shell command") ; if (return_code == 1) do something ; else if (return_code == 2) do something ; else do something ;
WINDOWS环境可以用管道
在bash shell中 $? 既为上一次调用程序的返回值
示意流程如下: return_code = system("shell command") ; if (return_code == 1) do something ; else if (return_code == 2) do something ; else do something ; 本回答被提问者采纳
能实现的。
linux中有trap命令可以拦截到ctrl+c信号并忽略它:使用命令kill -l可以列出系统的信号名称,通常我们需要忽略的信号有四个,即:HUP, INT, QUIT, TSTP,也就是信号1, 2, 3, 24;QUIT即信号3就是表示操作CTRL+C;trap的使用格式为:trap 操作 信号名称例如: trap "echo iuioooo" 3 表示捕获到信号3(ctrl+c)时并不会退出而是会 执行命令echo iuioooo;同样可以trap "" 3 表示什么也不操作。使用 trap 3 来使其恢复默认设置。
昨天刚使用过。trap命令可以完成,你man一下。kill -l可以列出所有的信号 本回答被提问者采纳
你可以多写几个判断嘛。把脚本的层次写深点。
直接 用shell中的重定向符号就可啦。比如 你执行 ps -aux 查询所有的进程 并写入文件,你就可以ps -aux > pro.txt如果再次执行,要在文件末尾追加信息ps -aux >> pro.txt如果是要覆盖原来的信息ps -aux >pro.txt 本回答由网友推荐
ls -R>指定文件??