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://xiahunao.cn/news/3015535.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式学习<1>:建立工程、GPIO

嵌入式学习_part1 本部分笔记用于学习记录&#xff0c;笔记源头 >>b站江科大_STM32入门教程 建立工程、GPIO 开发环境&#xff1a;keil MDK、STM32F103C8T6 1 &#xff09;建立工程 &#xff08;1&#xff09;基于寄存器开发、基于标准库 或者 基于HAL库开发; &…

10种软件架构模式解析

1. 单体应用架构&#xff08;Monolithic Architecture&#xff09; &#x1f44c;单体应用架构是最基本的架构模式&#xff0c;它将整个应用作为一个单独的部署单元。所有功能和模块都集成在一个应用中&#xff0c;易于开发和部署&#xff0c;但随着应用的增长&#xff0c;可维…

java.lang.NoSuchMethodException: com.ruoyi.web.controller.test.bean.HeadTeacher

软件开发过程中使用Java反射机制时遇到了下面的问题 com.ruoyi.web.controller.test.bean.HeadTeacher4b9af9a9 com.ruoyi.web.controller.test.bean.HeadTeacher4b9af9a9java.lang.NoSuchMethodException: com.ruoyi.web.controller.test.bean.HeadTeacher.<init>(java…

python判断大图中包含小图并输出位置总结

python判断大图中包含小图并输出位置总结 没啥可说的&#xff0c;项目遇到了就直接上代码&#xff0c;可以减轻劳动力&#xff0c;花最少得时间实现应用功能。 import cv2 # 读取大图片和小图片的路径 img_big cv2.imread(big_image.png) img_small cv2.imread(small_image…

【方法】如何创建RAR格式压缩文件?

为了方便存储或者传输文件&#xff0c;我们经常会把文件打包成不同格式的压缩包&#xff0c;那如果想创建的是RAR格式的压缩包&#xff0c;要如何做呢&#xff1f; RAR是WinRAR软件独有的压缩格式&#xff0c;所以我们可以通过WinRAR软件来创建RAR格式压缩包。下面分享两种创建…

视频素材哪个app好?8个视频素材库免费使用

视频内容已成为现代传播中不可或缺的一部分&#xff0c;具备卓越的视频素材对于提升任何媒体作品的质量和吸引力尤为关键。这里列举的一系列精挑细选的全球视频素材网站&#xff0c;旨在为您的商业广告、社交媒体更新或任何其他类型的视觉项目提供最佳支持。 1. 蛙学府&#x…

FileLink跨网文件交换,推动企业高效协作|半导体行业解决方案

随着信息技术的迅猛发展&#xff0c;全球信息产业已经迎来了前所未有的繁荣与变革。在这场科技革命中&#xff0c;半导体作为信息产业的基础与核心&#xff0c;其重要性日益凸显&#xff0c;半导体的应用场景和市场需求将进一步扩大。 然而&#xff0c;在这一繁荣的背后&#x…

OceanBase学习1:分布式数据库与集中式数据库的差异

目录 1. 传统集中式数据库 2. 数据库中间件的分库分表 3. 分布式数据库的基本特点及对比分析 4. OceanBase和传统数据库的对比 5. 小结 1. 传统集中式数据库 优点 成熟稳定:经过近40年的发展&#xff0c;应用到各行各业&#xff0c;产品技术非常成熟稳定行业适配性强:适配…

微软开发新模型;YouTube 推出新AI功能;可折叠iPhone 或发布?

微软或开发新模型与 Google、OpenAI 竞争 The Information 报道&#xff0c;微软正在训练一种新的 AI 大模型「MAI-1」&#xff0c;规模上足以与 Google、Anthropic 乃至 OpenAI 的先进模型抗衡。 据报道&#xff0c;这个 MAI-1 模型由微软聘请的 Inflection 前 CEO Mustafa S…

notepad++安装 hex-editor插件

打开notepad 点击插件 搜索 hex-editor,点击右侧 安装install 安装成功后&#xff0c;在已安装插件中就有显示了

分布式任务调度工具 XXL-JOB

默认的账号密码是&#xff1a;admin/123456 一&#xff0c;部署docker容器 docker run \ -e PARAMS"--spring.datasource.urljdbc:mysql://192.168.150.101:3306/xxl_job?Unicodetrue&characterEncodingUTF-8 \ --spring.datasource.usernameroot \ --spring.dataso…

百度副总裁秒批离职,00后的职场逆袭?

“员工闹分手提离职我秒批”&#xff0c;百度副总裁璩静的职场经历和思考在近期引发了大量讨论。 璩静在小红书分享了自己作为女性管理者&#xff0c;面对团队内部的感情问题&#xff0c;是如何处理的&#xff1a; “我第一时间就跟这个年轻的女孩子说&#xff0c;你走吧&…

Llama3-Tutorial之XTuner微调Llama3图片理解多模态

Llama3-Tutorial之XTuner微调Llama3图片理解多模态 基于 Llama3-8B-Instruct 和 XTuner 团队预训练好的 Image Projector 微调自己的多模态图文理解模型 LLaVA。 参考&#xff1a; https://github.com/SmartFlowAI/Llama3-Tutorial 1. 环境、模型、数据准备 1.1 配置环境 使用如…

【Delphi7】Access violation at address 0019F7C3. Write of address 0019F7C3.

这里写目录标题 问题基本情况问题描述1、启动Delphi 开发程序 时连续报如下错误2、打开“工程”菜单下的“选项”页面时时连续报如下错误 解决方案1、打开“高级系统设置”2、打开“性能选项”3、添加“数据执行保护”的程序4、选择“数据执行保护”的程序5、应用“数据执行保护…

从项目开始学习Vue——02(若依框架)

往期&#xff1a; 从项目开始学习Vue——01 目录标题 一、基础插件&#xff08;一&#xff09;路由Vue Router&#xff08;二&#xff09;导航守卫&#xff08;路由拦截器&#xff09;二、Vuex&#xff08;一&#xff09;什么是VuexVuex的部分介绍内容&#xff1a; &#xff08…

【数据分享】2022年中国1km分辨率的河网密度数据(免费获取)

水系数据是我们在各项研究中经常使用的数据&#xff01;之前我们分享过一份来源于Open Street Map的2024年全国水系数据&#xff08;可查看之前的文章获悉详情&#xff09;&#xff01; 本次我们分享一份来源于Science Data Bank平台上的2022年中国1km分辨率的河网密度数据&am…

【正点原子Linux连载】 第四十章 Linux网络驱动实验 摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南

1&#xff09;实验平台&#xff1a;正点原子ATK-DLRK3568开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id731866264428 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/docs/boards/xiaoxitongban 第四十…

java编程中,实现分页对象的类型转换

一、背景 当数据库分页查询返回的对象与接口要返回的对象类型不一致时&#xff0c;不可避免需要进行类型转换。 示例&#xff1a;数据库分页查询返回的对象是PageDTO&#xff0c;而接口返回的对象类型是PageVO。 PageDTO Data public class PageDTO<T> {/*** Current…

低代码系统能够解决哪些痛点?

不同的应用场景下&#xff0c;低代码系统解决的痛点是不一样的。工业应用场景中的组态软件应该说是最早的低代码系统了。以 Topstack 为代表的Web 组态软件&#xff0c;其核心功能设备数据采集、图形监控画面、数据报表、数据看板、业务逻辑开发等&#xff0c;都是无代码或低代…

观测云 VS ELK:谁是日志监控的王者?

前言 作为 IT 信息系统运行状态感知和故障分析的重要手段&#xff0c;日志在行业兴起之初便为运维和开发环节所广泛应用。当应用和系统发生故障或出现问题时&#xff0c;日志数据成为了排查和诊断问题的重要依据。通过分析日志&#xff0c;开发人员和运维人员可以了解系统的运…