一口Linux

电子技术应用专栏作家——一口Linux。一起学习嵌入式、Linux、网络、驱动、arm知识

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

0
阅读(1007)

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

image.png

实例代码:

image.png

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

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

system()函数

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

image.png

由手册可得:

  • system()是库函数

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

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

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

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

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

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

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

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

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

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

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

可以通过函数chdir()

image.png

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

代码举例:

image.png

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

验证system()

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

编写测试函数

image.png

执行结果

image.png

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

image.png

image.png

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

好了,本文就到这,

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

image.png

敬请关注!

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


原文链接:https://mp.weixin.qq.com/s/64xAPVhntRjz65SvrCqi7g


微信图片_20220701092006.jpg

电子技术应用专栏作家  一口Linux