头条资讯网_今日热点_娱乐才是你关心的时事新闻

今日热点 时事资讯
娱乐头条才是你关心的新闻
首页 > 头条资讯 > 科技

在程序里面执行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的老铁,抓紧加一口君好友吧!

未经允许不得转载:头条资讯网_今日热点_娱乐才是你关心的时事新闻 » 在程序里面执行system(“cd/某个目录“),为什么路径切换不成功?

分享到:更多 ()
来源:一口Linux 编辑:科技

评论

留言/评论 共有条点评
昵称:
验证码:
匿名发表