本页二维码,扫一扫分享到朋友圈
朋友圈

popen函数实现捕获shell里命令的输出--外加自己的一个小接口函数


阅读158 评论0 赞 23返回首页    go 编程与技术  go C&C++


C语言里有个popen函数,用来捕获shell里命令的输出,这样C和shell也可以相互通信了。

自己的接口函数,可随便调用,很方便

[cpp] view plain copy

  1. static int get_cmd_ret(char *cmd,char *buf,int len)  

  2. {  

  3.         if(!cmd || !strlen(cmd))  

  4.                 return -1;   

  5.         if(len <= 0)  

  6.                 return -1;   

  7.         FILE   *stream;  

  8.         memset( buf, 0,len);  

  9.   //      printf("cmd--%s--\n",cmd);  

  10. //        printf("buf--%s--\n",buf);  

  11.         stream = popen(cmd, "r" );  

  12.         fread( buf, sizeof(char),len, stream);  

  13.         pclose(stream);  

  14.         return 1;  

  15. }  

在网上看了个例子修改了一下,原文:http://blogold.chinaunix.net/u/16292/showart_393022.html


[cpp] view plain copy

  1. ·  /*  

  2. ·  作用:演示popen用法,将源程序输出到argv[1]命名的文件中  

  3. ·  使用:argv[0] outputFile  

  4. ·  */    

  5. · #include <sys/types.h>      

  6. · #include <unistd.h>      

  7. · #include <stdlib.h>      

  8. · #include <stdio.h>      

  9. · #include <string.h>    

  10. · #define CMDLEN  1024    

  11. · int main(int argc, char** argv)      

  12. · {      

  13. ·     do    

  14. ·     {    

  15. ·       if ( 2 != argc)    

  16. ·       {    

  17. ·         printf("Usage:%s outputFile!\n",argv[0]);    

  18. ·         break;    

  19. ·       }    

  20. ·           

  21. ·       FILE   *stream;      

  22. ·       FILE    *wstream;    

  23. ·       char   buf[1024];     

  24. ·       char   myCmd[CMDLEN];    

  25. ·       memset(myCmd,0,CMDLEN);     

  26. ·       strcpy(myCmd,"cat ");    

  27. ·       strcat(myCmd,argv[0]);    

  28. ·       strcat(myCmd,".c");    

  29. ·       memset( buf, '\0', sizeof(buf) );//初始化buf,以免后面写如乱码到文件中    

  30. ·       stream = popen( myCmd, "r" ); //将myCmd命令的输出 通过管道读取(“r”参数)到FILE* stream    

  31. ·       wstream = fopen( argv[1], "w+"); //新建一个可写的文件    

  32. ·       fread( buf, sizeof(char), sizeof(buf),  stream);  //将刚刚FILE* stream的数据流读取到buf中    

  33. ·       fwrite( buf, 1, sizeof(buf), wstream );//将buf中的数据写到FILE    *wstream对应的流中,也是写到文件中    

  34. ·       pclose( stream );      

  35. ·       fclose( wstream );    

  36. ·     }while(0);    

  37. ·     return 0;    

  38. ·  }      



 Linux系统进程控制编程(五)——popen函数调用

摘要:本文介绍了popen函数的使用方法和行为机理,并给出实际的例子来辅助说明了popen函数的使用方法。

文件中还介绍了几个文件操作的函数,如fopen,fread,fwrite等

  

popen使用FIFO管道执行外部程序。

#include <stdio.h>

FILE *popen(const char *command, const char *type);

int pclose(FILE *stream);

popen 通过type是r还是w确定command的输入/输出方向,r和w是相对command的管道而言的。r表示command从管道中读入,w表示 command通过管道输出到它的stdout,popen返回FIFO管道的文件流指针。pclose则用于使用结束后关闭这个指针。

下面看一个例子:

[cpp] view plain copy

  1. /******************************************************************************************* 

  2. ** Name:popen.c 

  3. **      This program is used to show the usage ofpopen() . 

  4. ** Author:zieckey,(zieckey@yahoo.com.cn) 

  5. ** Date:2007/9/30 11:47 

  6. ** All rights reserved! 

  7. *******************************************************************************************/  

  8. #include <sys/types.h>    

  9. #include <unistd.h>    

  10. #include <stdlib.h>    

  11. #include <stdio.h>    

  12. #include <string.h>  

  13.   

  14. int main( void )    

  15. {    

  16.     FILE   *stream;    

  17.     FILE    *wstream;  

  18.     char   buf[1024];   

  19.        

  20.     memset( buf, '\0', sizeof(buf) );//初始化buf,以免后面写如乱码到文件中  

  21.     stream = popen( "ls -l", "r" ); //将“ls -l”命令的输出 通过管道读取(“r”参数)到FILE* stream  

  22.     wstream = fopen( "test_popen.txt","w+"); //新建一个可写的文件  

  23.   

  24.     fread( buf, sizeof(char), sizeof(buf),  stream); //将刚刚FILE* stream的数据流读取到buf中  

  25.     fwrite( buf, 1, sizeof(buf), wstream );//将buf中的数据写到FILE    *wstream对应的流中,也是写到文件中  

  26.       

  27.     pclose( stream );    

  28.     fclose( wstream );  

  29.       

  30.     return 0;  

  31. }     



[root@localhost src]# gcc popen.c 

[root@localhost src]# ./a.out   

[root@localhost src]# cat test_popen.txt 

总计 128

-rwxr-xr-x 1 root root 5558 09-30 11:51 a.out

-rwxr-xr-x 1 root root  542 09-30 00:00 child_fork.c

-rwxr-xr-x 1 root root  480 09-30 00:13 execve.c

-rwxr-xr-x 1 root root 1811 09-29 21:33 fork.c

-rwxr-xr-x 1 root root  162 09-29 18:54 getpid.c

-rwxr-xr-x 1 root root 1105 09-30 11:49 popen.c

-rwxr-xr-x 1 root root  443 09-30 00:55 system.c

-rwxr-xr-x 1 root root    0 09-30 11:51 test_popen.txt

-rwxr-xr-x 1 root root 4094 09-30 11:39 test.txt


  上一篇:go c语言获取当前工作路径
  下一篇:go Linux下C/C++代码调用PHP代码


评论


用QQ登录管理/创建网站 用微博登录管理/创建网站   发布于:05-07