在程序里面执行system(“cd /某个目录“),为什么路径切换不成功?
0赞彭老师,问下,在程序里面执行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()这个函数是如何调用系统调用的。
编写测试函数
执行结果
由截图可知, 当我们运行程序时,首先会加载链接库,以便于我们执行当前程序,
写的很清楚了,clone与fork行为一致。
好了,本文就到这,
预告一下,彭老师的新书《从0开始学ARM》,这两天马上就上架,
敬请关注!
想学linux的老铁,抓紧加一口君好友吧!
原文链接:https://mp.weixin.qq.com/s/64xAPVhntRjz65SvrCqi7g
电子技术应用专栏作家一口Linux