🐶博主主页:@ᰔᩚ. 一怀明月ꦿ
❤️🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++,linux
🔥座右铭:“不要等到什么都没有了,才下定决心去做”
🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀
目录
环境变量
putenv
父进程myprocess添加环境变量,看子进程mytest是否能获取到
execle
exec族函数底层都是execve
内建命令和普通命令
chdir
fgets()
fprintf()
sprintf
getcwd
环境变量
当我们在进行程序替换的时候,子进程(mytest)对应的环境变量,是可以只从父进程(myprocess)来的
[BCH@hcss-ecs-6176 11_7]$ cat myprocess.c #include<stdio.h> #include<unistd.h> #include<sys/types.h> #include<sys/wait.h> int main() {pid_t id=fork();if(id==0){//childprintf("pid:%d,excel command begin\n",getpid());execl("./mytest","mytest",NULL);//程序替换printf("pid:%d,excel command end\n",getpid());}else{//fatherpid_t rid=waitpid(-1,NULL,0);if(rid>0){printf("wait success,rid:%d\n",rid);}}return 0; }[BCH@hcss-ecs-6176 11_14]$ cat test.cc #include<iostream> using namespace std; int main(int argc,char* argv[],char* env[]) {int i=0;for(;env[i];i++){cout<<i<<":"<<env[i]<<endl;//打印环境变量}return 0; }[BCH@hcss-ecs-6176 11_14]$ ./myprocess pid:29868,excel command begin //子进程的环境变量 0:XDG_SESSION_ID=1303 1:HOSTNAME=hcss-ecs-6176 2:TERM=xterm 3:SHELL=/bin/bash 4:HISTSIZE=10000 5:SSH_CLIENT=117.136.87.215 10217 22 6:SSH_TTY=/dev/pts/2 7:USER=BCH 8:LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36: 9:MYENV_10_21=the_day_is_very_conflused,in10_21 10:MAIL=/var/spool/mail/BCH 11:PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/BCH/.local/bin:/home/BCH/bin 12:PWD=/home/BCH/11_14 13:LANG=zh_CN.UTF-8 14:HISTCONTROL=ignoredups 15:SHLVL=1 16:HOME=/home/BCH 17:LOGNAME=BCH 18:SSH_CONNECTION=117.136.87.215 10217 192.168.0.7 22 19:LESSOPEN=||/usr/bin/lesspipe.sh %s 20:XDG_RUNTIME_DIR=/run/user/1000 21:HISTTIMEFORMAT=%F %T BCH 22:_=./myprocess 23:OLDPWD=/home/BCH wait success,rid:29868
myprocess的进程的环境变量是从bash进程来的
bash:父进程 myprocess:儿子进程 mytest:孙子进程
如何验证,孙子进程能够获取父进程的环境变量
[BCH@hcss-ecs-6176 11_14]$ export MY11_14=2023_11_14//bash进程创建的环境变量MY11_14 [BCH@hcss-ecs-6176 11_14]$ make make: 对“all”无需做任何事。 [BCH@hcss-ecs-6176 11_14]$ ./myprocess//子进程myprocess pid:3572,excel command begin 0:XDG_SESSION_ID=1303 1:HOSTNAME=hcss-ecs-6176 2:TERM=xterm 3:SHELL=/bin/bash 4:HISTSIZE=10000 5:SSH_CLIENT=117.136.87.215 10217 22 6:OLDPWD=/home/BCH 7:SSH_TTY=/dev/pts/2 8:USER=BCH 9:LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36: 10:MYENV_10_21=the_day_is_very_conflused,in10_21 11:MAIL=/var/spool/mail/BCH 12:PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/BCH/.local/bin:/home/BCH/bin 13:PWD=/home/BCH/11_14 14:LANG=zh_CN.UTF-8 15:HISTCONTROL=ignoredups 16:SHLVL=1 17:HOME=/home/BCH 18:MY11_14=2023_11_14//孙子进程mytest中含有MY11_14 19:LOGNAME=BCH 20:SSH_CONNECTION=117.136.87.215 10217 192.168.0.7 22 21:LESSOPEN=||/usr/bin/lesspipe.sh %s 22:XDG_RUNTIME_DIR=/run/user/1000 23:HISTTIMEFORMAT=%F %T BCH 24:_=./myprocess wait success,rid:3572
putenv
在C语言中,putenv 函数用于设置环境变量的值。其函数原型定义在头文件 stdlib.h 中,并且其函数声明如下:
int putenv(char *string);
putenv 函数接受一个形如 "name=value" 的字符串作为参数,表示要设置的环境变量名和其对应的值。该函数会根据提供的字符串来设置或修改环境变量。如果环境变量已经存在,则会被覆盖;如果不存在,则会被创建。
以下是putenv函数的使用示例: #include <stdlib.h> int putenv(char *string);示例1:设置新的环境变量 #include <stdlib.h> int main() {char *env_var = "MY_VAR=hello";putenv(env_var);// 在这里使用环境变量MY_VARreturn 0; }示例2:修改现有环境变量的值 #include <stdlib.h> #include <stdio.h> int main() {char *env_var = "PATH=/new/path";putenv(env_var);// 在这里使用修改后的PATH环境变量printf("%s\n", getenv("PATH")); // 打印修改后的路径return 0; }
需要注意的是,putenv函数会修改当前进程及其子进程的环境变量。如果你希望永久性地修改环境变量,可以在shell的配置文件中使用其他方法,如通过export命令或修改配置文件(例如.bashrc或.profile)来实现。
需要注意的是,putenv 函数的返回值为 0 表示成功,非零值表示失败。
需要谨慎使用 putenv 函数,因为它会直接修改当前进程的环境变量,可能会对整个程序产生影响。在多线程或并发环境中,还需要注意可能的竞争条件和线程安全性问题。
父进程myprocess添加环境变量,看子进程mytest是否能获取到
[BCH@hcss-ecs-6176 11_14]$ cat myprocess.c #include<stdio.h> #include<unistd.h> #include<sys/types.h> #include<sys/wait.h> int main() {char* env_val="MYVAL1=1878****454";//在myproces进程创建环境变量putenv(env_val);pid_t id=fork();if(id==0){//childprintf("pid:%d,excel command begin\n",getpid());execl("./mytest","mytest",NULL);printf("pid:%d,excel command end\n",getpid());}else{//fatherpid_t rid=waitpid(-1,NULL,0);if(rid>0){printf("wait success,rid:%d\n",rid);}}return 0; }[BCH@hcss-ecs-6176 11_14]$ ./myprocess pid:32050,excel command begin 0:XDG_SESSION_ID=1302 1:HOSTNAME=hcss-ecs-6176 2:TERM=xterm 3:SHELL=/bin/bash 4:HISTSIZE=10000 5:SSH_CLIENT=117.136.87.215 10216 22 6:SSH_TTY=/dev/pts/0 7:USER=BCH 8:LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36: 9:MYENV_10_21=the_day_is_very_conflused,in10_21 10:MAIL=/var/spool/mail/BCH 11:PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/BCH/.local/bin:/home/BCH/bin 12:PWD=/home/BCH/11_14 13:LANG=zh_CN.UTF-8 14:HISTCONTROL=ignoredups 15:SHLVL=1 16:HOME=/home/BCH 17:LOGNAME=BCH 18:SSH_CONNECTION=117.136.87.215 10216 192.168.0.7 22 19:LESSOPEN=||/usr/bin/lesspipe.sh %s 20:XDG_RUNTIME_DIR=/run/user/1000 21:HISTTIMEFORMAT=%F %T BCH 22:_=./myprocess 23:OLDPWD=/home/BCH 24:MYVAL1=1878****454//子进程的能获取到 wait success,rid:32050
环境变量被子进程继承下去是一种默认行为,不受程序替换的影响
程序替换,只替换新程序的代码和数据,环境变量是不会替换的
execle
execle 是 Linux 中的一个系统调用,用于执行一个新的程序。它是 exec 函数族中的一员,用于替换当前进程的内存映像,以执行一个新的程序。与其他 exec 函数不同的是,execle 允许指定环境变量。
下面是 execle 函数的原型:
#include <unistd.h> int execle(const char *pathname, const char *arg0, ..., const char *argn, char *const envp[]); pathname 是要执行的新程序的路径。 arg0 到 argn 是新程序的命令行参数。 envp 是一个指向环境变量数组的指针,每个环境变量都是以 "name=value" 格式的字符串。
execle 会将当前进程的内存映像替换为新程序的内存映像,并在替换之前将其命令行参数和环境变量传递给新程序。
下面是一个简单的例子,演示如何使用 execle 执行一个新的程序并传递环境变量:
#include <unistd.h> #include <stdio.h>int main() {// 环境变量数组char *envp[] = {"PATH=/usr/bin", "HOME=/home/user", NULL};// 执行新的程序,传递环境变量if (execle("/bin/ls", "ls", "-l", NULL, envp) == -1) {perror("execle");return 1;}return 0; }
exec族函数底层都是execve
内建命令和普通命令
在Linux中,有两种类型的命令:内建命令(Built-in Command)和普通命令(External Command)。
1. 内建命令(Built-in Command):
* 内建命令是由Shell解释器(如Bash)提供的特殊命令。
* 它们直接在Shell进程中执行,不需要启动新的进程。
* 一些常见的内建命令包括:cd、pwd、echo、export、alias、history等。
* 由于在Shell解释器中执行,内建命令可以直接访问和修改Shell的状态和环境变量。
2. 普通命令(External Command):
* 普通命令是独立的可执行文件或脚本,位于系统的可执行文件路径中。
* 它们需要通过启动新的进程来执行。
* 普通命令可以是系统自带的工具,也可以是用户自己编写的程序或脚本。
* 例如,ls、cp、grep、awk等常见的Linux命令都是普通命令。
区别:
* 内建命令直接在Shell解释器中执行,速度较快,并且可以直接访问和修改Shell的状态和环境变量。
* 普通命令需要通过启动新的进程执行,会稍微慢一些,但具有更高的灵活性和扩展性。
* 内建命令通常提供了一些常用的功能,例如目录切换、环境变量设置等,而普通命令则提供了更多的系统工具和应用程序。
在命令行中,可以使用 type 命令来确定一个命令是内建命令还是普通命令。例如:
$ type cd cd is a shell builtin$ type ls ls is /usr/bin/ls 上述示例显示了 cd 是一个内建命令(shell builtin),而 ls 则是一个位于 /usr/bin/ls 的普通命令。
总之,在Linux中,内建命令和普通命令各自有其特点和用途。了解它们的区别有助于更好地理解和使用命令行环境。
chdir
在Linux中,chdir 是一个用于改变当前工作目录的函数。它的原型定义在头文件 unistd.h 中,并且其函数声明如下:
int chdir(const char *path); 该函数接受一个字符串 path,表示将要切换到的目标工作目录的路径。 chdir 函数会将当前进程的工作目录更改为指定路径。
下面是一个简单的示例代码,演示了如何使用 chdir 函数改变当前工作目录:
#include <stdio.h> #include <unistd.h> int main() {char path[] = "/home/user/Documents"; // 目标工作目录的路径if (chdir(path) == 0) {printf("Successfully changed the current directory.\n");}else {perror("chdir() error");return 1;}return 0; } 在上面的示例中,我们使用 chdir 函数将当前工作目录更改为 "/home/user/Documents"。 如果成功切换目录,chdir 函数返回值为 0,并打印一条成功的消息; 否则,它返回 -1,并使用 perror 函数打印出错信息。
需要注意的是,chdir 函数只能改变当前进程的工作目录,而不会影响其他进程的工作目录。此外,chdir 函数也可以通过使用相对路径来改变当前工作目录,如 "../" 表示上一级目录,"./" 表示当前目录等。
fgets()
在Linux中,fgets 是一个用于从文件流中读取一行字符的函数。它的原型定义在头文件 stdio.h 中,并且其函数声明如下:
char *fgets(char *s, int size, FILE *stream); 该函数接受三个参数: * s:指向一个字符数组的指针,用于存储读取的字符串。 * size:要读取的最大字符数(包括空字符)。 * stream:要从中读取的文件流。 fgets 函数会从指定的文件流中读取字符,直到遇到换行符(包括换行符在内) 或者达到指定的字符数为止,并将结果存储到 s 所指向的字符数组中。 如果成功读取了字符,则返回 s;如果到达文件末尾或者发生错误,则返回空指针。
下面是一个简单的示例代码,演示了如何使用 fgets 函数从标准输入流中读取一行字符:
#include <stdio.h> int main() {char buffer[1024];printf("Enter a string: ");if (fgets(buffer, sizeof(buffer), stdin) != NULL) //标准输入流,键盘{printf("You entered: %s", buffer);} else {perror("fgets() error");return 1;}return 0; } 在上面的示例中,我们首先声明一个大小为 1024 的字符数组 buffer 作为缓冲区, 然后调用 fgets 函数从标准输入流中读取一行字符,并将结果输出到标准输出流中。
C语言默认会打开三个输入输出流:
stdin:标准输入流
stdout:标准输出流
strerr:标准错误流
fprintf()
在Linux中,fprintf 是一个用于将格式化数据写入文件流的函数。它的原型定义在头文件 stdio.h 中,并且其函数声明如下:
int fprintf(FILE *stream, const char *format, …); 该函数接受一个文件指针 stream,一个格式化字符串 format, 以及可变数量的参数。fprintf 函数根据指定的格式化字符串将数据写入到指定的文件流中。
下面是一个简单的示例代码,演示了如何使用 fprintf 函数将数据写入文件:
#include <stdio.h> int main() {FILE *file = fopen("output.txt", "w"); // 打开一个文件用于写入if (file != NULL) {int num = 42;float pi = 3.14;char str[] = "Hello, world!";fprintf(file, "Integer: %d\n", num); // 将整数写入文件fprintf(file, "Float: %f\n", pi); // 将浮点数写入文件fprintf(file, "String: %s\n", str); // 将字符串写入文件fclose(file); // 关闭文件} else {perror("fopen() error");return 1;}return 0; } 在上面的示例中,我们首先使用 fopen 函数打开一个名为 "output.txt" 的文件用于写入。然后,我们使用 fprintf 函数将一个整数、 一个浮点数和一个字符串按照指定的格式写入到文件中。最后,我们使用 fclose 函数关闭文件流。
sprintf
在Linux中,sprintf 是一个用于将格式化数据写入字符串的函数。它的原型定义在头文件 stdio.h 中,并且其函数声明如下:
int sprintf(char *str, const char *format, ...); 该函数接受一个字符数组 str,一个格式化字符串 format,以及可变数量的参数。 sprintf 函数根据指定的格式化字符串将数据写入到指定的字符数组中。
下面是一个简单的示例代码,演示了如何使用 sprintf 函数将数据写入字符串:
#include <stdio.h> int main() {char buffer[100];int num = 42;float pi = 3.14;sprintf(buffer, "Integer: %d, Float: %f", num, pi); // 将格式化数据写入字符数组printf("Result: %s\n", buffer); // 打印结果return 0; }
在上面的示例中,我们首先声明一个大小为 100 的字符数组 buffer 作为缓冲区,然后使用 sprintf 函数将一个整数和一个浮点数按照指定的格式写入到字符数组中。最后,我们使用 printf 函数打印结果。
getcwd
在Linux中,getcwd 函数用于获取当前工作目录的路径。它的原型定义在头文件 unistd.h 中,并且其函数声明如下:
char *getcwd(char *buf, size_t size); 该函数接受两个参数: * buf:一个指向存储路径名的缓冲区的指针。 * size:缓冲区的大小。 getcwd 函数会将当前工作目录的绝对路径复制到 buf 中,并返回指向 buf 的指针。 如果 buf 的大小小于当前工作目录的路径名长度,或者发生其他错误,则返回空指针并设置 errno。 通常情况下,我们可以通过传递 NULL 作为 buf 参数来让 getcwd 函数自动分配足够大的缓冲区。
下面是一个简单的示例代码,演示了如何使用 getcwd 函数:
#include <stdio.h> #include <unistd.h> int main() {char path[1024];if (getcwd(path, sizeof(path)) != NULL){printf("Current working directory: %s\n", path);} else {perror("getcwd() error");return 1;}return 0; } 在上面的示例中,我们首先声明一个大小为 1024 的字符数组 path 作为缓冲区, 然后调用 getcwd 函数获取当前工作目录的路径,并输出到标准输出流中。
getcwd 是一个用于编程的函数,而 pwd 是一个用于命令行操作的命令。它们都提供了获取当前工作目录路径的功能,但是在使用方式和应用场景上有所不同。
🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸