有网友碰到过这样的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环境可以用管道

linux下如何在C程序中获取到脚本执行的结果 第1张

在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可以列出所有的信号 本回答被提问者采纳

linux下如何在C程序中获取到脚本执行的结果 第2张

你可以多写几个判断嘛。把脚本的层次写深点。

直接 用shell中的重定向符号就可啦。比如 你执行 ps -aux 查询所有的进程 并写入文件,你就可以ps -aux > pro.txt如果再次执行,要在文件末尾追加信息ps -aux >> pro.txt如果是要覆盖原来的信息ps -aux >pro.txt 本回答由网友推荐

ls -R>指定文件??