Linux 第二十二章

🐶博主主页:@ᰔᩚ. 一怀明月ꦿ 

❤️‍🔥专栏系列:线性代数,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 是一个用于命令行操作的命令。它们都提供了获取当前工作目录路径的功能,但是在使用方式和应用场景上有所不同。

  🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/674872.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MapReduce的Shuffle过程

Shuffle是指从 Map 产生输出开始,包括系统执行排序以及传送Map输出到Reduce作为输入的过程. Shuffle 阶段可以分为 Map 端的 Shuffle 阶段和 Reduce 端的 Shuffle 阶段. Shuffle 阶段的工作过程,如图所示: Map 端的 Shuffle 阶段 1&#xff09;每个输入分片会让一个 Map 任务…

我的256天之创作纪念日

目录 时光 数据的一些变化 开心的事 憧憬 时光 自上次CSDN的消息推送&#xff0c;又一个128天过去了&#xff0c;整天的工作和生活都在忙忙碌碌中度过&#xff0c;每到能静下来片刻&#xff0c;都倍感珍惜。因为一些原因&#xff0c;能够陪伴家人的时间越来越少&#xff…

C语言 动态内存管理

目录 1. C/C程序的内存分配2. 动态内存分配的作用3. malloc - 分配内存4. free - 释放内存5. calloc - 分配并清零内存6. realloc - 调整之前分配的内存块7. 常见的动态内存的错误7.1 对空指针解引用7.2 对动态开辟空间的越界访问7.3 对非动态开辟内存使用free7.4 使用free释放…

软件设计师-应用技术-UML建模题3

基础知识及技巧&#xff1a; 1. 用例图&#xff1a; 1.1 考点&#xff1a; 题干里面有关项目的详细描述&#xff0c;完整用例图中的某些参与者和某些用来扣掉&#xff0c;根据题干内容和已有用例图补充。根据题干&#xff0c;分析用例图之间的关系。 1.2 基础知识&#xff…

力扣:62. 不同路径

62. 不同路径 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&…

仓库管理员如何入门?仓库管理六大步骤教会你!

新手菜鸟入行&#xff0c;如何做好一个仓库管理员&#xff1f;仓库运营对于许多行业至关重要&#xff0c;例如制造、零售和物流。它们涉及高效、安全地接收、仓储、拣选、包装和运输货物。 跟着这6个步骤做&#xff0c;最慢一个月&#xff0c;最快一周&#xff0c;就能轻松做好…

【Unity】使用Resources.LoadAll读取文件的顺序问题

最近在做客户的一个项目&#xff0c;其中的一个模块使用到了照片&#xff0c;但是发现了一个很严重的问题。当你在使用Unity的时候&#xff0c;它竟然不按照顺序读取&#xff1f;这个机器人是不是逻辑有问题&#xff1f;如下图&#xff1a; 名字脱敏了哈。。。 照片比较多&…

【计组OS】访存过程以及存储层次化结构

苏泽 本专栏纯个人笔记作用 用于记录408 学习的笔记记录&#xff08;敲了两年码实在不习惯手写笔记了&#xff09; 如果能帮助到大家当然最好 但由于是工作后退下来备考 很多说法和想法都会结合实际开发的思想 可能不是那么的纯粹应试哈 希望大家挑选自己喜欢的口味食用…

神经网络怎么把隐含层变量融合到损失函数中?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

STM32F10x移植FreeRTOS

一、获取FreeRTOS源码 &#xff08;1&#xff09;登录FreeRTOS官网&#xff1a;www.freertos.org&#xff0c;下载第一个压缩包 &#xff08;2&#xff09;通过GitHub网站&#xff1a;github.com/FreeRTOS/FreeRTOS下载&#xff0c;由于该网站服务器在国外&#xff0c;所以访问…

2-5 任务:打印九九表

本次实战的目标是通过编写程序实现打印九九乘法表、字符矩形、字符平行四边形和字符菱形等图形&#xff0c;以及解决百钱买百鸡问题和输出素数等实际问题。在实战过程中&#xff0c;我们将学习并掌握以下知识点。 双重循环的使用&#xff1a;通过双重循环实现九九乘法表的打印&…

[笔记] Win11 Microsoft Store App 离线下载

微软应用商店无法下载或下载缓慢解决方法 在一些环境下 Microsoft Store 下载速度缓慢&#xff0c;或者需要账号登录才能安装的场景&#xff0c;可以通过找到对应的离线安装包的形式进行安装。 Micorsoft Store 中的离线安装包一般后缀为 AppxBundle 和 Appx。以 Ubuntu 为例…