天天看点

开启一个新的终端并执行特定的命令

我的项目中有利用到远程控制,从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,就到这!

拙见,小记!