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

建设一个直播网站360免费wifi无法在win10下正常运行

建设一个直播网站,360免费wifi无法在win10下正常运行,南宁网页制作培训,自设计网站粉丝提问: 彭老师,问下,在程序里面执行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/372754/

相关文章:

  • 东莞外贸网站建设开发电子商务平台网站建造
  • 网站建设的实验步骤网站本地环境搭建教程
  • 专门培训seo的网站长治在百度做个网站多少钱
  • 学院网站建设情况总结专业制作app的公司
  • 做外贸如何浏览国外网站房地产销售流程详细
  • 网站突然打不开是什么原因网站改版计划
  • 中小企业网站制作模板vs做网站怎么调试
  • 新手做视频网站wordpress新站都该设置些什么
  • 朔州市网站建设湖南人文科技学院
  • 专业seo网站优化公司自定义wordpress导航图标
  • 网页休闲游戏网站抖音开放平台是什么意思
  • 个人作品网站策划书2017年内蒙古建设厅网站
  • 潍坊网站建设收费标准列举常用网站开发技术
  • 深圳网站公司注册科技类网站风格
  • 南昌做微信网站pc端应用界面ui设计
  • 网站服务器分流怎么做wordpress优惠券发放插件
  • 免费建自己的网站赚钱wordpress win8模板
  • wordpress交费台州seo推广公司
  • 公司网站用哪个软件做如何加入广告联盟赚钱
  • 建设网络道德教育网站的有效措施有湛江市住房和城乡建设局网站
  • 怎么做微信小说网站食品餐饮网站建设
  • 宁波优化网站厂家外贸网站seo博客
  • 网站怎么做ipfs上海平台网站建设哪家有
  • 无法打开网站若要访问本地iis网站必须安装下列iis组件手机qq钓鱼网站怎么做
  • 网站建设教程在线怎么把网站黑了
  • 老板合作网站开发wordpress首页显示当前时间
  • 学校校园网站建设方案微信小程序开发者中心
  • 自己怎么优化网站北京建设网网站
  • 想做网站怎么做石家庄网站制作公司排名前十
  • 网上怎么开网店创业企业网站怎么做seo优化