实例代码:
粉丝的疑惑是明明第10行执行了cd /media操作, 为什么12行执行的pwd ˃ test2.txt结果提示的仍然是当前目录?
这是一个很不错的问题,要想整明白这个问题,需要知道system的原理。system()函数通过man手册来查看system库函数:
由手册可得:system()是库函数通过fork()函数创建子进程在子进程中通过EXEC族函">
当前位置:恩施知识网 > 情感人生 > 正文

Linux下执行system(cd/某个目录)为什么路径切换不成功

粉丝提问:彭老师,问下,在程序里面执行system("cd /某个目录"),这样会切换不成功,为啥呢
实例代码:
粉丝的疑惑是明明第10行执行了cd /media操作, 为什么12行执行的pwd ˃ test2.txt结果提示的仍然是当前目录?
这是一个很不错的问题,要想整明白这个问题,需要知道system的原理。system()函数通过man手册来查看system库函数:
由手册可得:system()是库函数通过fork()函数创建子进程在子进程中通过EXEC族函
粉丝提问:

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

Linux下执行system(cd/某个目录)为什么路径切换不成功

实例代码:

Linux下执行system(cd/某个目录)为什么路径切换不成功

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

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

system()函数

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

Linux下执行system(cd/某个目录)为什么路径切换不成功

由手册可得:

system()是库函数通过fork()函数创建子进程在子进程中通过EXEC族函数执行shell命令

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

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

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

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

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

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

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

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

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

可以通过函数chdir()

CHDIR(2) Linux Programmer's Manual CHDIR(2)NAME chdir, fchdir - change working directorySYNOPSIS #include int chdir(const char *path); int fchdir(int fd); Feature Test Macro Requirements for glibc (see feature_test_macros(7)): fchdir(): _BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED || /* Since glibc 2.12: */ _POSIX_C_SOURCE >= 200809LDESCRIPTION chdir() changes the current working directory of the calling process to the directory specified in path. fchdir() is identical to chdir(); the only difference is that the directory is given as an open file descriptor.RETURN VALUE On success, zero is returned. On error, -1 is returned, and errno is set appropriately.

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

代码举例:

1 #include 2 #include 3 #include 4 5 int main(int argc, char **argv) 6 { 7 system("ls"); 8 chdir("/"); 9 system("ls"); 10 return 0; 11 }peng@ubuntu:~/test$ ./run 123.c a.sh basic chat chris encryption net run sgm3141 srandapp boot dev home initrd.img.old lib32 libx32 media opt root sbin srv tftpboot usr vmlinuz wwwbin cdrom etc initrd.img lib lib64 lost found mnt proc run snap sys tmp var vmlinuz.old

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

验证system()

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

编写测试函数

1 #include 2 #include 3 4 int main(int argc, char **argv) 5 { 6 system("ls"); 7 return 0; 8 }

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

在Linux系统中,strace命令是一个集诊断、调试、统计与一体的工具,可用来追踪调试程序,能够与其他命令搭配使用

执行结果:

Linux下执行system(cd/某个目录)为什么路径切换不成功

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

access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3

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

clone(child_stack=0, flags=CLONE_PARENT_SETTID|SIGCHLD, parent_tidptr=0x7fffdff4b59c) = 2753

并获取到执行结果

wait4(2753, 123.c a.sh basic chat chris encryption net run sgm3141 srand

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

man clone

Linux下执行system(cd/某个目录)为什么路径切换不成功

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

Linux下执行system(cd/某个目录)为什么路径切换不成功

鐢佃剳cmd杈撳叆cd data\system鍛戒护鏄剧ず鎵句笉鍒版寚瀹氳矾寰勬庝箞鍥炰簨锛

鑻ュ湪鎸囧畾鐩褰曞墠甯鍒欒〃绀轰粠璇ョ洏涓嬫墍鎸囧畾钄借寗鐨勭洰褰曪紝鑻ュ湪鎸囧畾鐩褰曞墠涓嶅甫琛ㄧず浠庡綋鍓嶇洰褰曟彁绀虹︿笅杩涘叆鍒颁笅绾х洰褰曪紝濡侱鐩樺垯鐩存帴d锛岄偅鏄鐩存帴閿鍏ョ洏绗︾殑锛孋D鏄鎵撳紑褰撳墠鐩樹笅鐨勬墍瀛樺湪鐨勬枃浠跺す锛堟爣绉扮洰褰曪級;琛ㄧず鏍瑰畯杩愬療鐩褰曪紝鑻ユ兂鍒板叾瀹冪洏绗. 锛屾倓闆逛竴涓鐐硅〃绀哄綋鍓嶇洰褰曪紝濡傝繑鍥炴牴鐩褰曪細cd 銆銆濡傞鍥炰笂涓绾 cd .锛屼袱涓鐐硅〃绀轰笂涓绾х洰褰曪紝鍗曠嫭涓涓鍛靛懙

Linux下执行system(cd/某个目录)为什么路径切换不成功

linux鎬庝箞杩斿洖涓婄骇鐩褰曞晩锛岀敤cd/鍛戒护鍗磋繖鏍凤細bash锛歝d/:娌℃湁閭d釜鏂囦欢鎴栫洰褰

浣犳暡鍏ョ殑鍛戒护鏄閿欑殑锛屾g‘鐨勫懡浠ゆ槸cd 绌烘牸 /鎴栬卌d 绌烘牸锛岃繖涓ょ嶆柟娉曢兘鍙浠ヨ繑鍥炰笂绾х洰褰曘備笅闈浠嬬粛涓婰inux涓媍d鐨勪竴浜涘熀纭鐢ㄦ硶锛

1銆乧d [dirName]锛氬垏鎹㈠埌鐩褰昫irName

2銆乧d ..鎴栬卌d /锛氳烦鑷充笂灞傜洰褰

3銆乧d ../../:璺宠嚦涓婁笂灞傜洰褰

4銆乧d /:璺宠嚦鏍圭洰褰

5銆乧d /root/linuxdaxue.com/testDir:浣跨敤缁濆硅矾寰勮烦杞鐩褰

6銆乧d $TEST_PATH锛氫娇鐢ㄧ幆澧冨彉閲忚繘琛岃烦杞鐩褰

7銆乧d -锛氳烦鍏ヤ笂娆′娇鐢ㄧ洰褰

鎵╁睍璧勬枡锛

鏂颁汉鍙浠ュ氱湅浜涘伐鍏蜂功锛屾瘮濡傞笩鍝ョ殑绉佹埧鑿滐紝涓嬮潰鏍规嵁涓浜虹粡楠岃翠笅濡備綍瀛︿範Linux

鍒濈骇闃舵碉細

1銆佸懡浠ゆ槸蹇呴』瑕佸︾殑锛宭inux甯哥敤鐨勫懡浠ゅぇ姒傚湪80涓宸﹀彸锛岃繖浜涘父鐢ㄥ懡浠や竴瀹氳佺啛缁冩帉鎻°

2銆佹帉鎻linux杞浠跺寘鐨勫父鐢ㄥ畨瑁呮柟娉曪紝渚嬪傛簮鐮佸畨瑁咃紝rpm鏂瑰紡瀹夎呯瓑绛夈

3銆佸︿範瀹夎呰惧囬┍鍔ㄧ▼搴忥紙姣斿傜綉鍗°佹樉鍗¢┍鍔锛

4銆佺啛鎮塆rub/Lilo寮曞肩▼搴忓強绠鍗曠殑淇澶嶆搷浣溿

5銆佺啛鎮塋inux鏂囦欢绯荤粺鍜岀洰褰曠粨鏋勪互鍙妉inux鍩烘湰杩愯屽師鐞嗐

6銆佹帉鎻vi锛実cc锛実db绛夊父鐢ㄧ紪杈戝櫒锛岀紪璇戝櫒锛岃皟璇曞櫒銆

7銆佺悊瑙shell鍒鍚嶃佺¢亾銆両/O閲嶅畾鍚戙佽緭鍏ュ拰杈撳嚭浠ュ強shell绠鍗曡剼鏈缂栫▼銆

8銆佸︿範Linux鐜澧冧笅鐨勭綉缁滃熀鏈缁勫缓銆

楂樼骇闃舵碉細

1銆佸皾璇曢槄璇籰inux鍐呮牳婧愮爜锛岃繖闇瑕佸叿鏈変竴楗ュ瓭瀹氱殑C銆丆++璇瑷鍩虹锛屽洜涓篊銆丆++鏄痩inux/unix鐨勬牳蹇冭鑺﹁偄閫楄█锛岀郴缁熶唬鐮侀兘鏄疌鍐欑殑銆

2銆佸皾璇曠紪璇戝畨瑁呭拰璋冭瘯鑷宸辩殑linux鍐呮牳锛氬湪闃呰绘簮鐮佷簡瑙d簡linux搴曞眰鐨勮繍琛屽師鐞嗗悗锛屽畬鍏ㄥ彲浠ョ紪璇戜竴涓閫傚悎鑷宸辩殑linux绯荤粺鏉ャ

3銆佹繁鍏ュ︿範shell锛 perl锛宑gi绛夎剼鏈璇瑷锛氳繖浜涜剼鏈闄鍗栬瑷鍦╨inux涓嬮潪甯稿己澶э紝瀹冧滑鑳藉畬鎴愪綘鎯冲仛鐨勪换浣曚簨鎯咃紝鐔熺粌鎺屾彙杩欎簺璇瑷锛屽彲浠ヨ╀綘鍦╨inux绯荤粺涓嬫父鍒冩湁浣欙紝濡傞奔寰楁按銆

4銆佹瀯寤轰紒涓氱骇linux楂樺彲鐢ㄩ泦缇ょ郴缁燂細linux涓嬫湁寰堝氬紑婧愬厤璐圭殑闆嗙兢杞浠讹紝鍒╃敤杩欎簺鍏嶈垂鐨勯泦缇よ蒋浠跺畬鍏ㄥ彲浠ユ瀯寤哄嚭涓庡晢涓歶nix绯荤粺鎯冲茬編鐨勯泦缇ょ郴缁熸潵銆

免责申明:以上内容属作者个人观点,版权归原作者所有,不代表恩施知识网立场!登载此文只为提供信息参考,并不用于任何商业目的。如有侵权或内容不符,请联系我们处理,谢谢合作!
当前文章地址:https://www.esly.wang/qinggang/103191.html 感谢你把文章分享给有需要的朋友!
上一篇:你知不知道10万个为什么「你不知道的十万个为什么」 下一篇:cad常见的问题和解决方法「CAD经常出现的问题及解决方案一请关注加收藏」

文章评论