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

在程序里面执行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()

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的老铁,抓紧加一口君好友吧!

相关文章:

在程序里面执行system(“cd /某个目录“),为什么路径切换不成功?

粉丝提问&#xff1a; 彭老师&#xff0c;问下&#xff0c;在程序里面执行system(“cd /某个目录”)&#xff0c;这样会切换不成功&#xff0c;为啥呢 实例代码&#xff1a; 粉丝的疑惑是明明第10行执行了cd /media操作&#xff0c; 为什么12行执行的pwd > test2.txt 结…...

c++ 对类与对象的基础框架+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏

绪论 上一章&#xff0c;我们将c入门的基础知识进行了学习&#xff0c;本章其实才算真正的跨入到c开始可能比较难&#xff0c;但只有我们唯有不断的前进&#xff0c;才能斩断荆棘越过人生的坎坷&#xff01; 话不多说安全带系好&#xff0c;发车啦&#xff08;建议电脑观看&…...

关于Open Shift(OKD) 中应用管理部署的一些笔记

写在前面 因为参加考试&#xff0c;会陆续分享一些 OpenShift 的笔记博文内容为介绍 openshift 不同的创建应用的方式&#xff0c;包括&#xff1a; 基于 IS 创建应用基于镜像创建应用基于源码和 image 创建应用基于源码和 IS 创建应用基于模板创建应用 学习环境为 openshift v…...

【linux】对于权限的理解

权限 Linux权限的概念用户之间的切换 Linux权限管理文件权限操作文件的人Linux文件默认权限的设置权限掩码 所属组/其他删除拥有者创建的文件文件拥有者、所属组的修改修改文件拥有者修改文件所属组一次性修改拥有者和所属组 目录的执行权限 Linux权限的概念 首先&#xff0c;…...

测试人必备技能:如何进行WebSocket接口测试?

目录 前言 WebSocket介绍 HTTP与WebSocket的区别 二者关系 WebSocket测试方法 使用Postman 使用Jmeter 使用Python 结语 前言 随着Web应用的日益普及&#xff0c;WebSocket作为一种全双工通信协议&#xff0c;在移动端、游戏、视频会议等方面得到广泛应用。 而对于需…...

【Android FrameWork (三)】- SystemServer

文章目录 知识回顾启动第一个流程initZygote的流程 前言源码分析1.system_server2.SystemServer.main3,startBootstrapServices4,startService 拓展知识LoadApkcontext 对于Android context 大家是怎么理解的&#xff1f;LocalServices.java: addServece方法中 ArrayMap和HashM…...

Docker容器部署及基本使用

文章目录 一、环境初始化配置二、安装Docker三、优化配置四、基础命令 一、环境初始化配置 1、关闭防火墙 systemctl stop firewalld systemctl disable firewalldsetenforce 0sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config sed -i s/SELINUXenforcing/S…...

【机智云物联网低功耗转接板】+模拟MCU快速上手

GE211是机智云自研的定制化转接板&#xff0c;使用 ESP32-C3-WROOM-02 通讯模块&#xff0c;适用于白色智能家电等设备应用。 转接板已经烧录了机智云连云的最新GAgent固件&#xff0c;所以不需要烧写任何软件就可以快速上手使用。 GE211板卡带有一个串口&#xff0c;一般是把这…...

ai免费写作在线平台-ai免费伪原创文章生成器软件

ai伪原创能检测出来吗 人工智能技术可以检测伪原创&#xff0c;但是不是所有的伪原创都可以被检测出来。 现在有许多自然语言处理&#xff08;NLP&#xff09;算法和技术可以用来检测伪原创内容&#xff0c;例如文本相似度比较算法&#xff0c;语气分析算法等。这些算法可以检…...

Web自动化测试简介及web自动化测试实战交教程

一、认识web自动化测试 1.什么是自动化测试&#xff1f; 自动化测试的概念: 软件自动化测试就是通过测试工具或者其他手段&#xff0c;按照测试人员的预定计划对软件产品进行自动化测试&#xff0c;他是软件测试的一个重要组成部分&#xff0c;能够完成许多手工测试无法完成或…...

基于单片机的家庭应急电源设计

基于单片机的家庭应急电源 摘 要 本设计基于STC89C52单片机设计得应急电源&#xff0c;以应急电源为研究对象&#xff0c;单片机设计为控制集成IC&#xff0c;ADC为模数转换控制模块&#xff0c;无源蜂鸣器作为报警电路。系统分为单片机设计最小系统&#xff0c;AD转换控制模…...

线程七大状态

线程生命周期&#xff08;七大状态&#xff09; 新建状态&#xff08;New&#xff09;&#xff1a;当Java线程被创建时&#xff0c;它处于新建状态。此时&#xff0c;线程对象已被创建&#xff0c;但尚未启动。在这个状态下&#xff0c;线程并没有开始执行任何代码&#xff0c;…...

Linux第一章

文章目录 前言一、操作系统概述二、Linux初识1.Linux系统的诞生2.Linux系统内核3.Linux发行版 三、虚拟机介绍四、安装vmware workStation1.VMware WorStation软件2.安装 五、vm安装linux六、远程连接Linux系统1.图形化、命令行2.为什么使用命令行操作linux3.使用FinalShell软件…...

Microsoft Defender for Identity部署方案

目录 前言 一、重要组件 二、部署步骤 1、准备 Azure 订阅 2、配置 Microsoft Defender for Identity 门户...

超越YOLOv8,飞桨推出精度最高的实时检测器RT-DETR!

‍‍ 众所周知&#xff0c;实时目标检测( Real-Time Object Detection )一直由 YOLO 系列模型主导。 飞桨在去年 3 月份推出了高精度通用目标检测模型 PP-YOLOE &#xff0c;同年在 PP-YOLOE 的基础上提出了 PP-YOLOE 。后者在训练收敛速度、下游任务泛化能力以及高性能部署能力…...

基于Docker安装Redis【保姆级教程、内含图解】

Redis官网&#xff1a;Redis Redis中文官网&#xff1a;CRUG网站 两者选其一即可&#xff0c;建议使用 Redis官网&#xff1a;Redis 学习任何框架和技术&#xff0c;一定要参考相应的官网学习&#xff0c;一定要参考官网学习&#xff01;&#xff01;&#xff01; 目录 一、拉取…...

电子表格软件与一站式BI的区别

看完本节内容&#xff0c;相信您能够了解到电子表格软件&#xff08;代号电子表格软件&#xff09;与「一站式 BI」的主要区别。所谓一站式BI在官网上的名称就是Smartbi V10.5&#xff0c;代号就是Smartbi一直在使用insight。 这两个产品都属于商业智能BI软件的品类&#xff0…...

SpringCache

一、介绍 Spring Cache是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;只需要简单地加一个注解&#xff0c;就能实现缓存功能&#xff0c;大大简化我们在业务中操作缓存的代码。 Spring Cache只是提供了一层抽象&#xff0c;底层可以切换不同的cache实现。具体就…...

Android Framework—Service

介绍 Service是一种可以在后台执行长时间运行操作而不提供界面的应用组件。服务可以由其他应用组件启动&#xff0c;而且即使用户切换到其他应用&#xff0c;服务仍将在后台继续运行。此外&#xff0c;组件可以通过绑定到服务与之进行交互&#xff0c;甚至是执行进程之间的通信…...

leetcode (重排数组使得)连续子数组的权值和最小

题目描述&#xff1a;请重新排列某个仅包含2和3的数组&#xff0c;使得数组的所有连续子数组权值之和最小数组的权值定义为,数组中所有元素之积的因子个数&#xff0c;例如&#xff1a;rank([2,3])4 x p 1 c 1 p 2 c 2 p 3 c 3 ⋅ ⋅ ⋅ p k c k r a n k ( c 1 1 ) ( c …...

JSP计算机等级考试查询系统(源代码+论文+答辩PPT)

第一章 引言 计算机等级考试查询系统是有其开发的必要性的&#xff0c;它的应用将大大节省了学校的人力资源&#xff0c;从而从人工劳动中解脱出来。我们这次开发的软件系统一共包括了三个部分&#xff1a;等级考试的报名系统、查询系统和管理系统。其中管理系统是另外两部分…...

python 基础系列篇:七、以函数方式编写一个数字华容道

python 基础系列篇&#xff1a;七、以函数方式编写一个数字华容道 数字华容道游戏分析开始编写完整代码代码解说定义方法的规律 小结 数字华容道 嗯&#xff0c;就是一个简单的益智游戏&#xff0c;把数字按照特定规律排列&#xff0c;并比矩阵少一个格&#xff0c;用来进行移…...

2023年前端面试题

1.position都有哪些属性 2.1px等于多少rem&#xff0c;rem根据根元素的大小&#xff0c;根元素是谁 3.Es6操作数组的方法 4.防抖和节流以及应用场景 5.Vue和ajax最大的区别是什么&#xff08;Vue和ajax怎么操作dom的&#xff0c;vue虚拟dom&#xff09; 6.js数据类型有哪些&…...

快速入门量化交易

本文首发自「慕课网」&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注"慕课网"&#xff01; 原作者&#xff1a;袁霄|慕课网讲师 近来“量化交易”这个词听得越来越频繁&#xff0c;多数人对量化交易的第一印象是“高大上的技术”…...

Mongodb oplog

在MongoDB复制集中,oplog信息存储在oplog.rs集合中。 oplog.rs集合是一个固定大小的集合(capped collection),它位于local数据库中。 当我们在源MongoDB实例上启用了复制(replication)功能,MongoDB会自动在local数据库中创建oplog.rs集合。此后,所有在该实例上的写操作都会生…...

python基础篇: python字符串方法都有哪些?你知道多少?

❝ Python提供了丰富的字符串处理方法&#xff0c;可以方便地对字符串进行操作、处理和转换。在本文中&#xff0c;我们将介绍Python中常用的字符串方法。 ❞ python中字符串内置方法很多&#xff0c;可以通过dir()方式查看具体有哪些方法&#xff0c;下表是python字符串的全部…...

chmod 命令 (chmod 0660)

chmod的作用: 用于设置文件所有者和文件关联组的命令,就是控制用户的权限命令 注意事项: chown 需要超级用户 root 的权限才能执行此命令。 自己常用chmod 命令是 chmod 777 * 给所有文件权限 chmod 777 文件名 给单独文件权限 这个777 是怎么来的, 或者chmod 0660 这…...

Qt应用开发常用功能

Qt判断当前操作系统&#xff1f; #ifdef Q_OS_MAC //mac ... #endif#ifdef Q_OS_LINUX //linux ... #endif#ifdef Q_OS_WIN32 //win ... #endif#ifdef __arm__ //arm ... #endifQt实现应用程序关闭和重启&#xff1f; //关机按钮-点击槽函数 void SystemD::on_shutdownButton…...

麻了,部门新来的00后给我卷崩溃了...

今天上班开早会就是新人见面仪式&#xff0c;听说来了个很厉害的大佬&#xff0c;年纪还不大&#xff0c;是上家公司离职过来的&#xff0c;薪资已经达到中高等水平&#xff0c;很多人都好奇不已&#xff0c;能拿到这个薪资应该人不简单&#xff0c;果然&#xff0c;自我介绍的…...

代码随想录算法训练营第56天|583. 两个字符串的删除操作,72. 编辑距离

代码随想录算法训练营第56天|583. 两个字符串的删除操作&#xff0c;72. 编辑距离 583. 两个字符串的删除操作72. 编辑距离 583. 两个字符串的删除操作 题目链接&#xff1a;583. 两个字符串的删除操作&#xff0c;难度&#xff1a;中等 【实现代码】 class Solution { publi…...