popen和system问题

1. 问题描述

C的代码里面去调用命令启动一个shell脚本,分别使用了下面两个途径。

其中一个是: func1(cmd) { popen(cmd,type); pclose(); }
另一个是: func2() { system(cmd); } 其中cmd类似于“./xxx.sh &”。
问题就是,func1这种调法,会导致xxx.sh运行阻塞,脚本最开始添加打印信息都没有显示,但是top后显示进程存在;而func2调用后脚本运行正常。

2. 问题分析

通过分析popen,pclose,system的源码,两者的流程分别如下:

首先看popen,pclose的流程:
父进程调用popen,
popen(cmd, type)
{ 返回一对fd(分别用来重定向子进程的读和写,但不是同时,根据type父进程和子进程最后分别只能用一个)
fork
1. 子进程重定向fd,将标准输出或者标准输入定向到一个fd,然后执行execl cmd,
返回;
2. 父进程收到子进程返回的fd
}
父进程调用pclose
pclose { 1.等待popen出来的子进程结束; 2.关闭fd }
然后是system的流程:
system { fork; 1. 子进程execv cmd; 2. 父进程wait子进程退出; 返回; }
上面的流程简单点,总结出来就是摘自stackoverflow上的一个解释:
popen gives you a pair of file handles you can use to read and write input and output to and from stdin/stdout of the running process in an interactive manner. The system call is merely executing that and redirecting stdin of the current process to that of the invoked child process, and stdout of that process to stdout of the current (host) process. It depends what you are trying to achieve, in general. If your goal is simply to run a command, system works fine. If you're interested in reading its output in a programmatic manner and processing it (and possibly generating more input), then popen is going to work better.

子进程的标准输入和标准输出,和跟着开启他的父进程的配置来的,当执行一个命令会后台运行的时候,比如./test.sh &, 其实又是fork出来一个子进程,然而内部封装的接口my_system接口中是连续调用的popen和pclose,这就导致了最终后台运行起来的那个test.sh子进程,它里面被popen中重定向的fd已经被关闭了,所以后面所有的echo打印都会报错“broken pipe”。表现出来就是在串口中看不到任何脚本里面的打印信息。

3. 问题总结

封装一个popen和pclose连续调用的接口,对于执行不依赖任何标准输入输出的命令是可以使用的,但是实际上这样做还不如直接调用system; 代码中频繁调用system和popen这种系统调用都会有一个问题,就是进程的切换都会带来性能上的一些开销,这个是c和shell混合编程的一个隐患,所以项目后期还是需要尽量将shell脚本中的业务集成进来,减少这种性能开销,也减少这种类似的调用上的一些异常。

转载于:https://www.cnblogs.com/doctors/p/10110967.html

popen和system问题相关推荐

  1. 命令逐行显示_在LoadRunner中执行命令行程序之:popen()取代system()

    >>>推荐阅读<<< 1.性能测试学习笔记-场景设计 2.性能测试的重要意义 3.性能分析流程及方法 4.应用系统性能调优之性能分析 在LoadRunner中执行命 ...

  2. popen和system函数的区别 以及 popen打开的FILE指针能否用close替代fclose关闭

    popen和system函数的区别 在c/cpp程序中执行shell命令,通常有两种方式,一种是使用popen函数,一种是使用system函数:两者会调用fork函数从父进程中fork出一个子进程,然 ...

  3. linux中popen函数,system函数与popen函数

    为了更好的理解system()函数返回值,需要了解其执行过程,实际上system()函数执行了三步操作: fork一个子进程: 在子进程中调用exec函数去执行command: 在父进程中调用wait ...

  4. os.system和os.popen和commands

    os.system和os.popen os.system(cmd)的返回值是脚本的退出状态码,只会有0(成功),1,2 os.popen(cmd)返回脚本执行的输出内容作为返回值 当你想把执行命令返回 ...

  5. Python中 os.popen、os.system和subprocess.popen方法介绍

    Python 提供了多种与操作系统交互的方法,比如os模块中的popen和system方法,此外,Python subprocess模块中的Popen类也提供了与操作系统交互的方法,使用起来更加灵活, ...

  6. system与popen对比

    system与popen对比: popen和system都可以执行外部命令. popen相当于是先创建一个管道,fork,关闭管道的一端,执行exec,返回一个标准的io文件指针.system相当于是 ...

  7. 学习笔记——popen()函数详解

    popen()函数 引用度娘说的: popen() 函数通过创建一个管道,调用 fork 产生一个子进程,执行一个 shell 以运行命令来开启一个进程. 这个进程必须由 pclose() 函数关闭, ...

  8. system函数返回值,Linux

    理论 我们先看下man手册是怎么说的man system RETURN VALUEThe value returned is -1 on error (e.g., fork(2) failed), a ...

  9. 在LoadRunner向远程Linux/Unix执行命令行并收集性能数据

    前面介绍过在LoadRunner的Java协议实现"使用SSH连接Linux",当然连接之后的故事由你主导. 今天要讲的,是一个非Java版本.是对"在LoadRunne ...

最新文章

  1. php网络相关的扩展,文章专题扩展功能组件
  2. python中内存管理机制一共分为多少层_python 内存管理机制
  3. mysql 关闭锁_mysql数据库取消锁
  4. 计算机成绩表及格率怎么算,卫生资格人机对话如何考试如何评分?成绩如何核算?...
  5. 14产品经理要懂的-人性的目的性
  6. 解决浏览器跨域加载本地文件报错 Access to script at ‘xxx‘ from origin ‘null‘ has been blocked by CORS policy
  7. HLG 1334 最好的心情[lis 变形]
  8. 进程被kill原因_Linux内核系列 简析进程生命周期:从生到死的这一生(一)
  9. Linux终端命令格式
  10. 面包板是神马东西?。。
  11. 计算机英语单词怎么巧背,巧计英语单词的26个秘诀
  12. 汤姆猫代码python_用树莓派实现会说话的汤姆猫
  13. 51nod 1556 计算(默慈金数)
  14. tekton入门-细数tekton用到的那些images
  15. relative会脱离文档流吗_position:absolute会使元素脱离文档流
  16. 如何解决NavigationDuplicated: Avoided redundant navigation to current location:问题
  17. 安全设备默认地址账密总结
  18. Oracle Error:ORA-01465: 无效的十六进制数字【解决办法】
  19. oracle weblogic开启,菜鸟经验:oracle与weblogic自动启动与停止
  20. 高数叔数学建模学习笔记(1)

热门文章

  1. mvc+ef中比较数据
  2. 站内搜索--3--之Lucene.Net使用
  3. C# SendInput 实现模拟鼠标操作
  4. 图像检索新方向,阿里提出区域检索算法|CVPR 2020
  5. 零基础入门学习Python,我与python的第一次亲密接触后的感受
  6. 43岁被裁员,200万年薪泡汤:这4件事你要尽早明白
  7. java堆排序解决topk问题,利用堆排序来解决topK问题
  8. CVPR2020 Oral|场景去遮挡新方法:港中文首次提出自监督新框架,已开源
  9. 独家总结 | 决策树算法Python实现(附代码详解及注释)
  10. 拥抱ROS2系列:ROS2概述和实践入门(一)