当前位置: 首页 > news >正文

网站空间后台济南网站定制策划

网站空间后台,济南网站定制策划,兰州科技公司有哪些,坡头网站开发公司粉丝提问: 彭老师,问下,在程序里面执行system(“cd /某个目录”),这样会切换不成功,为啥呢 实例代码: 粉丝的疑惑是明明第10行执行了cd /media操作, 为什么12行执行的pwd > test2.txt 结…

粉丝提问:

彭老师,问下,在程序里面执行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()

CHDIR(2)                                                         Linux Programmer's Manual                                                        CHDIR(2)NAMEchdir, fchdir - change working directorySYNOPSIS#include <unistd.h>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 >= 200809LDESCRIPTIONchdir() 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 VALUEOn success, zero is returned.  On error, -1 is returned, and errno is set appropriately.

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

代码举例:

  1 #include <stdio.h>2 #include <stdlib.h>3 #include <unistd.h>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	srand
app  boot   dev  home	     initrd.img.old  lib32  libx32	media  opt   root  sbin  srv  tftpboot	usr  vmlinuz	  www
bin  cdrom  etc  initrd.img  lib	     lib64  lost+found	mnt    proc  run   snap  sys  tmp	var  vmlinuz.old

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

验证system()

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

编写测试函数

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

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

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

执行结果:

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

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


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

好了,本文就到这,想学linux的老铁,抓紧加一口君好友吧!

http://www.yayakq.cn/news/571398/

相关文章:

  • 浙江微信网站建设做网站的作文
  • 免费建自己的网站赚钱wordpress换标题
  • 北辰做网站wordpress 发布html
  • 投资网站php源码商城购物网站开发意义
  • 做会计题目的网站品牌建设存在的问题及建议
  • 百度网站建设是什么意思专业网站设计服务商
  • 怎样做网站营销推广营销平台
  • 给网站写教案做课件一节课多少钱大连网站排名推广
  • wordpress主题下载失败seo排名快速
  • 虹口免费网站制作app推广方案策划
  • 白银市城县建设局网站国外seo
  • 摄影网站 源码腾讯云网站建设视频
  • 做网站的变成语言哪类最简单背景墙素材高清图片免费
  • 手机企业网站开发263企业邮箱入口登录方法
  • 舟山网站建设开发专业做电子的外贸网站
  • 深圳网站建设优化服务微信端网站设计
  • 河南省路桥建设集团网站企云网站建设
  • 网站宣传文案vps免费
  • 用php做网站需要什么软件做视频网站需要什么证件
  • 做app原型的网站王野摩托车官方网站
  • 网站域名授权怎么做做网站排名多少钱
  • 台前网站建设公司公众号后台登录
  • 无锡新区建设环保局网站促销型网站
  • 高端设计网站制作wordpress汉化模板
  • 国内做家具外贸的网站长春市建设技工学校网站
  • 做网站首页文件网站空间购买流程
  • 广东省广州市白云区区号什么网站利于优化
  • 自己买个服务器做代挂网站百度秒收录软件工具
  • 城市建设者官方网站wordpress账户被禁用
  • 深圳网站建设认准乐云电商网站建设收费