我的项目中有利用到远程控制,从windows端远程控制linux端,那么也就是接收远程的命令并在本机执行并返回结果。在父进程中用到popen()函数,popen()函数通过创建一个管道,调用fork()产生一个子进程,执行一个shell以运行命令来开启一个进程。但是popen 函数是会阻塞的,子进程不结束父进程是不会执行的,这对于我就很不利,我在popen函数中执行的是一个长时间的命令,不可能等到它结束。想要不让子进程一直阻塞,有许多办法,比如开启一个定时器,时间一到结束子进程。但是有一个问题是如何结束该子进程,也就是如何获取该子进程的ID?我在网上搜了很多,也找到一些方法,但我感觉不行,于是就只能有一个相对来说比较笨一点的办法了。
那就是开启一个新的终端来执行这个耗时的命令,那么父shell中就可以执行其他的命令。话不多说,贴出代码:

system("gnome-terminal -x ffplay /home/levo/beyond.mp3");
//或者用popen函数
popen("gnome-terminal -x top","r");

其实我首先找到的不是-x,而是-e参数,结果发现开启的新shell,瞬间就关闭,试了好几个命令都是这样,不到一秒钟就关闭。后来一想,-x才是代表执行的意思嘛。最常见的就是chmod 中的+x参数。

//用这条命令终端会瞬间关闭
system("gnome-terminal -e ffplay /home/levo/beyond.mp3");

那么如何关闭用这两个函数开启的子进程呢?获取ID?并不是那么容易,当然我的办法还是最笨的,因为我知道命令名啊,那不是很简单:

killall ffplay;
//killall top;

因为新开启了shell,所以父shell中并不阻塞,任然能够执行后边的命令。
那么有没有其他的方法呢?答案是有。比如:将你的程序写成一个带GUI界面的程序,那么用上面两个函数开启子进程,将不会阻塞你的主程序。当然这对我并不适用。
OK,就到这!

                        拙见,小记!

开启一个新的终端并执行特定的命令相关推荐

  1. 你是不是特别想做好一个游戏主播?今天胖哥帮你开启一个新的大门

    你是不是特别想要做好一个游戏主播?你知道带货主播不好,做娱乐主播你没颜值,所以说你想通过游戏直播的方式来赚钱,因为你看着各种大IP小团团,张大仙批的,他们应该赚了很多钱,你知道你也在猜想似的,他们很赚 ...

  2. 从音箱到智能平台的进化,语音交互能开启一个新时代吗?

    两年前,很多人还认为智能音箱只是玩具,但据IDC报告显示,智能音箱2019年一季度全球出货量达到2320万台,当季中国智能音箱市场则首次破千万大关,达到1122万台,同比增长787.2%.智能音箱开始 ...

  3. java通过按钮打开新窗口_如何在java程序中,当点击一个按钮后,关闭当前窗口,开启一个新的窗口。...

    JButton btn=new JButton(new AbstractAction("关闭并打开") {      @Override   public void actionP ...

  4. 吴恩达亲述:如何高效阅读论文,开启一个新的领域!

    AI 圈的朋友应该都知道吴恩达的大名,为了防止一些萌新还不知道,本菌这里先做一个简要的介绍. ​ 吴恩达(英文名:Andrew Ng),是斯坦福大学计算机科学系和电子工程系教授,人工智能实验室主任,人 ...

  5. 开启一个新的命令行窗口

    1,start cmd /k echo Hello, World!2,start cmd /C pause区别是第二种执行完毕以后,新开的窗口会自动关闭,第一种则不会

  6. 第一节:复习委托,并且通过委托的异步调用开启一个新线程和异步回调、异步等待。

    一. 再谈委托 1. 委托是一个关键字为delegate的自定义类型,通过委托可以把方法以参数的形式传递给另外一个方法,实现插件式的开发模式: 同时调用委托的时候,委托所包含的所有方法都会被实现. 2 ...

  7. 第一节:复习委托,并且通过委托的异步调用开启一个新线程和异步回调、异步等待

    一. 再谈委托 1. 委托是一个关键字为delegate的自定义类型,通过委托可以把方法以参数的形式传递给另外一个方法,实现插件式的开发模式: 同时调用委托的时候,委托所包含的所有方法都会被实现. 2 ...

  8. 开启一个新话题计算机基础应用,计算机应用基础心得体会最新

    计算机应用基础心得体会最新计算机(computer)俗称电脑,是现代一种用于高速计算的电子计算机器,可以进行数值计算,又可以进行逻辑计算还具有存储记忆功能.是能够按照程序运行,自动.高速处理海量数据的 ...

  9. 开启一个新的spyder窗口

    PS H:\2020.12.19\2020.12.21.实证> spyder Spyder is already running. If you want to open a new insta ...

最新文章

  1. Android 自定义长按响应时间
  2. nginx 静态资源WEB服务
  3. 问题一:使用AndroidDriver而非原来的AppiumDriver的原因
  4. 常用的函数式接口_Predicate接口
  5. centos 5.0 编译安装apache 2.2.6+php5.2.5+mysql5.0.46+ZEND
  6. abp模块生命周期设计思路剖析
  7. rxjs 怎么使用_使用RxJS Observables进行SUPER SAIYAN
  8. java 创建文件夹的方法_java中创建文件夹的方法
  9. C语言学习笔记---001C语言的介绍,编译过程原理,工具等
  10. 前端验证码绘制(canvas)
  11. java 人物头像识别
  12. 雷达篇(四)雷达工作波段
  13. 万年历c语言程序微博,简易的万年历程序C语言
  14. 2021年全国程序员工资出炉想要年薪60万,难吗?网友,扎心了
  15. h3c交换机配置nat_史上最详细H3C路由器NAT典型配置案例
  16. php根据手机号码获取归属地,PHP通过API获取手机号码归属地,手机号码
  17. 《APUE.3E》用gdb调试ftw函数(图4-22)
  18. 三菱FX5U位逻辑指令
  19. 【解决】无线网卡windows仍在设置此设备的类配置,代码56解决方法
  20. Android 软键盘 弹出,默认隐藏,强制隐藏,自动变大写等

热门文章

  1. thinkphp mysql 密码加密_thinkphp框架实现mysql读写分离
  2. java aqs源码_Java-AQS源码详解(细节很多!)
  3. win10下Git和Tortoise安装并使用VS15保存到码云
  4. C语言:随笔8--结构体
  5. coco格式的数据集进行训练
  6. 4. 编程规范和编程安全指南--go语言
  7. kset_register
  8. 【Pandas库】(1) Series的创建方法
  9. C/C++ 全局变量和局部变量在内存里的区别?堆和栈
  10. 原生JS修改html内容不影响绑定的点击事件 请认准insertAdjacentHTML、insertAdjacentText方法