家人们谁懂啊!写应用代码时,总有那么些时刻,想偷懒不想重复造轮子——比如想列个文件、查个进程、跑个脚本,明明Shell一句命令就能搞定,非要用C从头写逻辑,纯纯纯纯纯“苦力行为”。
其实应用早就留了“后门”,能直接调用Linux Shell命令,还能监控执行状态,主打一个省时省力、高效摸鱼。今天就带大家盘懂system、popen、exec这三种实现方式,全程通俗易懂,笑点拉满,代码直接抄,看完就能上手!
先划重点:三种方式核心区别,一句话秒懂
怕大家看懵,先上极简总结,看不懂算我的!咱用职场摸鱼类比,瞬间通透:
•system():职场甩手掌柜,喊下属干活,只问成没成,不管中间产出,简单粗暴零门槛;
•popen():细心主管,喊下属干活,不仅要结果,还要把中间产出拿过来细看,能捕获命令输出;
•exec家族:终极卷王,亲自下场换身份干活,完全掌控全过程,自由度拉满,就是麻烦点。
核心刚需:不管用哪种,咱都要实现「执行命令+监控状态」,拒绝“盲跑”,错了能溯源、成了能确认! |
玩法一:system() —— 懒人首选,5行代码搞定
定位:最简单的调用方式,纯纯“工具人”函数,不用管进程、不用管管道,丢给它一句命令,坐等反馈就行。
原理:内部自动fork子进程,调用sh执行命令,阻塞等待执行完成,最后返回状态码。
适用场景:只想执行命令,不需要看输出,只关心成功/失败(比如重启服务、创建文件夹)。
实操代码(可直接编译运行)
避坑提醒:system是阻塞的,命令没跑完,代码就卡在这不动,急脾气慎用!
玩法二:popen() —— 既要执行,又要“抄作业”(拿输出)
定位:比system进阶一丢丢,既能执行命令,还能读取命令的输出结果,相当于把命令输出当成文件来读,实用性拉满。
原理:创建管道,fork子进程执行shell命令,父进程通过管道读取输出,最后用pclose关闭并拿状态。
适用场景:需要获取命令输出(比如读取文件内容、查询进程信息、统计数据)。
实操代码(可直接编译运行)
搞笑吐槽:popen就是典型的“既要又要”,不像system那么佛系,主打一个掌控感,输出结果全拿捏!
玩法三:exec家族 —— 大佬级玩法,极致掌控
定位:最底层、最灵活的方式,没有之一!属于应用调用Shell命令的“终极形态”,适合追求极致掌控的开发者。
原理:必须搭配fork()使用——父进程fork子进程,子进程调用exec函数,直接替换自身进程映像执行shell命令,父进程waitpid等待子进程,监控状态。
适用场景:需要重定向输入输出、管道通信、精细化控制进程,定制化需求拉满的场景。
实操代码(可直接编译运行)
小提示:exec函数超多(execl、execv、execlp等),咱用的execl最常用,新手先吃透这个就够啦!
状态监控万能宏:别瞎猜,看这几个就够
三种方式都离不开状态解析,这几个宏背下来,再也不用懵圈:
•WIFEXITED(status):判断命令是否正常退出(是=真,被信号杀=假);
•WEXITSTATUS(status):获取正常退出的状态码,0=成功,非0=报错;
•WIFSIGNALED(status):判断命令是否被信号终止;
•WTERMSIG(status):获取终止命令的信号编号。
终极选择指南:懒人速看,别纠结!
1.图省事、只看结果:闭眼冲system(),代码最少,上手最快;
2.要输出、要数据:选popen(),兼顾便捷性和实用性,日常开发最常用;
3.要定制、要掌控:冲fork+exec,虽然麻烦,但自由度天花板,高阶玩法必备。
结尾碎碎念
其实应用调用Linux Shell命令没那么玄乎,无非是“偷懒”的小技巧,三种方式吃透,日常开发效率直接翻倍。
别再死磕纯C造轮子了,学会“借力”Shell命令,才是高效编程的正确打开方式~ 代码都给你们整理好了,复制粘贴就能跑,赶紧去试试吧!
点赞+在看+收藏,编程不迷路,下期继续分享Linux/应用干货,带你轻松避坑、快乐摸鱼~ |
参考代码,关注LinuxROS公众号回复 shellCall 即可