linux下C++执行shell命令
背景
linux下C++执行shell命令的几种方式的学习记录。
Linux下C++中执行shell命令可以有多种方式:system函数、exec族函数等,但最灵活的还是popen
system()函数
system()函数只能运行命令,不能获取输出
简单示例如下
popen()函数
C++中使用popen运行linux系统命令并获取输出。
通过popen创建子进程,执行对应命令,并通过fgets获取输出,然后pclose关闭并获取执行结果。
popen:创建一个管道;
pclose:关闭I/O流,等待命令执行结束,然后返回shell的终止状态(执行结果);
函数定义:
1 | FILE * popen(const char *command , const char *type ) |
函数说明:
调用fork产生子进程,从子进程中调用/bin/sh -c来执行参数command的指令。
command参数:要执行的shell命令字符串
type参数:只能是读或者写中的一种。如果 type 为 r,那么调用进程读进 command 的标准输出。如果 type 为 w,那么调用进程写到 command 的标准输入。
注意:
popen创建的管道,默认读取的是标准输出stdout,但很多程序(如ffmpeg相关的)输出到stderr上,为了能方便地读取这些输出,需要在执行命令时,对输出做重定向(
popen函数示例代码一(未增加重定向)
执行效果如下:
假如把命令输入错误了,执行一下看看效果:
把示例代码一的这个命令内容输入为下面的样子,其他代码不变
编译后执行效果如下:
popen示例代码二(增加重定向)
只需要对命令增加(
编译后,执行错误命令的效果如下:
把代码里的错误命令改成对的ls -al,其他不变
然后编译执行看下效果
总结
如果需要执行shell命令并获取输出结果,那么最好采用重定向的方式。
参考链接
https://blog.csdn.net/weixin_42428854/article/details/120485677
https://blog.csdn.net/alwaysrun/article/details/109695107
源码
https://github.com/ThranduilELFKING/toolsUse/blob/main/execShellCmd/execShellCmd.cpp
//未重定向popen源码
https://github.com/ThranduilELFKING/toolsUse/blob/main/execShellCmd/execShellCmdOut.cpp
//重定向popen源码