首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在程序里面执行system(“cd/某个目录“),为什么路径切换不成功?

粉丝提问:

彭老师,问下,在程序里面执行system("cd /某个目录"),这样会切换不成功,为啥呢

实例代码:

粉丝的疑惑是明明第10行执行了cd /media操作,为什么12行执行的pwd > test2.txt结果提示的仍然是当前目录?

这是一个很不错的问题,要想整明白这个问题,需要知道system的原理。

system()函数

通过man手册来查看system库函数:

由手册可得:

system()是库函数

通过fork()函数创建子进程

在子进程中通过exec族函数执行shell命令

这样大家就明白了,实际上system执行参数中的字符串代表的命令,其实是创建了一个进程,然后在子进程中通过exec族函数来执行对应的命令。

当前工作路径,cwd,可以通过pwd来获取,

那么工作路径是和进程相关的,

第10行代码执行之后,虽然确实改变了此时的子进程的工作路径,

但是随着子进程的退出该工作路径已没有意义,

而执行到12行程序的时候,system()又会创建新的子进程,

该子进程仍然继承父进程的工作路径,

所以当前工作路径就没有变化。

程序中如何修改当前程序的工作路径?

可以通过函数chdir()

该函数是个系统调用(system是库函数)。

代码举例:

由结果可知,8行代码修改了当前进程的工作路径为根路径,所以第9行执行ls命令显示的是根路径下面的内容

验证system()

下面我们来看一下,system()这个函数是如何调用系统调用的。

编写测试函数

要想知道某个函数调用过程,最终调用到哪些系统调用函数,可以借助strace命令

执行结果:

由截图可知,当我们运行程序时,首先会加载链接库,以便于我们执行当前程序,

最终调用到系统调用函数clone(),

并获取到执行结果

但是前面说了,system不是调用fork的吗?

写的很清楚了,clone与fork行为一致。

好了,本文就到这,

预告一下,彭老师的新书《从0开始学ARM》,这两天马上就上架,

敬请关注!

想学linux的老铁,抓紧加一口君好友吧!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230424A0365100?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券