linux c/c 调用shell命令后获取shell返回值-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 1340252
  • 博文数量: 198
  • 博客积分: 1629
  • 博客等级: 上尉
  • 技术积分: 2743
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-01 15:41
文章分类

(198)

  • (1)
  • (4)
  • (1)
  • (5)
  • (8)
  • (10)
  • (2)
  • (10)
  • (18)
  • (109)
  • (30)
文章存档

(6)

(20)

(8)

(3)

(17)

(3)

(3)

(9)

(13)

(17)

(77)

(22)

最近访客
相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: 嵌入式

2022-11-11 15:51:33

项目中c/c 调用shell命令后,某系处理返回值的过程是以“临时文件”的方式进行;即shell命令执行后将返回值存放在临时文件(如temp.txt),c/c 程序再访问文件,获取shell的返回值。{banned}最佳经典的就是调用wifi(iwlist wlan0 scan )扫描指令查询wifi节点,然后解析获取wifi数量、名称、信号强度、加密方式等信息。

通过“临时文件”的方式交互数据,是比较简单、易用和易理解的方式,在多进程间、多线程间也可以使用,但一般不会使用。共享“临时文件”有个弊端就是效率上不比较低,创建文件、删除文件然后是访问,都是访问存储器(磁盘、flash),加上文件系统的一层封装和存储介质映射,访问速度不如访问内存快。

“临时文件”的方式,个人觉得不是很好,通过该案例总结下c/c 调用shell命令知识。

1.c/c 调用shell命令方式

linux 系统中使用 c/c 调用 shell 命令常用方式:

  • system()函数
  • popen()函数
  • exec函数簇

system()函数{banned}最佳常用,简单高效; popen() 执行 shell 命令的开销比 system() 小;system()和popen()都封装了进程创建、释放,内部实质调用的是exec函数簇;exec需手动fork进程进,然后再调用exec函数簇个,过程比前两者稍微复杂。

c语言执行linux shell命令,对于没有返回结果的,可直接使用system()函数,对于有返回结果的,可以用popen命令,对其封装后,可以获取相应的返回信息。
函数原型:

点击(此处)折叠或打开

  1. file * popen ( const char * command , const char * type );
  2.  
  3. int pclose ( file * stream );

  4. command:要执行shell命令
  5. type:创建的管道的读写类型("r" 或者 "w"
  6. 1.type为“r”时,管道连接到shell子进程的标准输出,
  7. 2.type为“w”时,管道连接到shell子进程的标准输入

  8. “r”就能获取shell命令的执行输出结果了。返回值为file *文件指针,使用fread即可从文件流指针
  9. 中读出输出结果。
实例:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2.  
  3. int main(void)
  4. {
  5.     file *fp = null;
  6.     char buf[100]={0};
  7.     fp = popen("ps", "r");
  8.     if(fp) {
  9.     
  10.         int ret = fread(buf,1,sizeof(buf)-1,fp);
  11.         if(ret > 0) {
  12.             printf("%s",buf);
  13.         }
  14.         pclose(fp);
  15.         printf("\n");
  16.     }
  17.     return 0;
  18. }

1.popen()会调用fork()产生子进程,然后从子进程中调用/bin/sh -c来执行参数command的指令。

2.popen函数还创建一个管道用于父子进程间通信。子进程要么从管道读信息,要么向管道写信息,至于是读
还是写取决于父进程调用popen时传递的参数。

3.pclose()用来关闭由popen所建立的管道及文件指针


popen是不堵塞的,也就是说不会等待子进程的结束并杀死子进程,即不会管理进程。这样就需要人为的去
杀死或忽略子进程等操作。还有就是popen会将执行的结果返回到buffer中。在执行期间调用进程会一直等
待shell命令执行完成。popen :没有对信号做任何的处理。popen()函数中没有屏蔽sigint、sigquit的
原因是因为popen是”并行的”,不能影响其它”并行”进程。

system是堵塞的,完成后会自动对进程进行管理,无需再去对进程进行管理。另外,system不会返回执行的
结果,只是会返回执行是否成功。system:对sigchld、sigint、sigquit都做了处理,system()调用对
信号屏蔽的原因是因为system能够及时的退出并且能够正确的获取子进程的退出状态(成功回收子进程)。

主要区别:system函数调用shell命令,但是无法获得运行的shell命令执行的输出结果。而使用popen
能够获取到输出结果。 popen后需要调用pclose防止子进程变成”僵尸”状态。

阅读(10478) | 评论(0) | 转发(0) |
1

上一篇:

下一篇:

给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图