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)
        {
                //child
                printf("pid:%d,excel command begin\n",getpid());
                execl("./mytest","mytest",NULL);//程序替换
                printf("pid:%d,excel command end\n",getpid());
        }
        else
        {
                //father
                pid_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_VAR
    return 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)
        {
                //child
                printf("pid:%d,excel command begin\n",getpid());
                execl("./mytest","mytest",NULL);
                printf("pid:%d,excel command end\n",getpid());
        }
        else
        {
                //father
                pid_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 是一个用于命令行操作的命令。它们都提供了获取当前工作目录路径的功能,但是在使用方式和应用场景上有所不同。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

为何大学计算机专业以C语言入门?探究C语言入门的好处

为何大学计算机专业以C语言入门&#xff1f;探究C语言入门的好处 在大学计算机专业中&#xff0c;C语言常作为入门语言&#xff0c;这并非偶然。C语言具有一些独特的优势&#xff0c;使其成为计算机科学教育中的理想选择。本文将探讨为何大学计算机专业选择以C语言入门&#xf…

Terraform资源

资源是Terraform中最核心的部分&#xff0c;使用Terraform的目的就是用于管理资源。 在Terraform中&#xff0c;资源使用resource块定义。 一个resource可以定义一个或多个基础设施资源对象&#xff0c;如&#xff1a;VPC&#xff0c;虚拟机&#xff0c;DNS记录&#xff0c;Con…

为什么都喜欢用串口通讯?那为什么还用RS485,SPI和I2C?

1、为什么都喜欢用串口通讯&#xff1f; 之前在做单片机产品的时候&#xff0c;用的最多的就是串口通讯&#xff0c;凡是单片机的外设&#xff0c;优先选用带串口功能的&#xff0c;比如蓝牙模块&#xff0c;WIFI模块&#xff0c;4G模块&#xff0c;电表和显示屏等等。 为什么都…

mysql的数据结构及索引使用情形

先来说下数据的一般存储方式&#xff1a;内存(适合小数据量)、磁盘(大数据量)。 磁盘的运转方式&#xff1a;速度 旋转&#xff0c;磁盘页的概念&#xff1a;每一页大概16KB。 1、存储结构 哈希 是通过hash函数计算出一个hash值的&#xff0c;哈希的优点就是查找的时间复杂度…

直说了,你可能从没真正理解MPLS

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 你们好&#xff0c;我的网工朋友。 尽管 MPLS 技术已经相当成熟&#xff0c;有关它的文章数不胜枚举&#xff0c;涵盖了从基本原理到 SR-MPLS 等…

Spring Boot集成RabbitMQ-之6大模式总结

A.集成 一&#xff1a;添加依赖 在pom.xml文件中添加spring-boot-starter-amqp依赖&#xff0c;以便使用Spring Boot提供的RabbitMQ支持&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp&…

【第三版 系统集成项目管理工程师】第2章 信息技术发展(知识总结)

持续更新。。。。。。。。。。。。。。。 【第2章】 信息技术发展 考情分析2. 1信息技术及其发展2.1.1 计算机软硬件-P501.计算机硬件2.计算机软件-P51 2.1.2计算机网络1.通信基础-P522.网络基础-P534.网络标准协议-P543.网络设备-P535.软件定义网络-P576.第五代移动通信技术-P…

2024抖音小店最新注册流程来了,快快收藏!

大家好&#xff0c;我是电商糖果 2024年想开一家抖音小店&#xff0c;但是不知道具体的开店流程。 不要着急&#xff0c;这篇文章就给大家详细的讲解一下。 首先&#xff0c;准备开店材料&#xff1a;5000左右的类目保证金&#xff0c;电脑&#xff0c;手机号&#xff0c;法…

Dos命令Tree

查看tree的用法 tree /?tree > 文件名&#xff0c;输出文件路径到指定的位置

苹果手机突然黑屏打不开怎么办?多种方法合集

苹果手机突然黑屏打不开怎么办&#xff1f;苹果手机突然开不开机了怎么办&#xff1f;手机打不开机了按键长按没有反应怎么办&#xff1f; 如果您的苹果手机出现这些情况无法正常开机&#xff0c;可以尝试以下办法恢复&#xff1a; 方法1&#xff1a;给手机充电 首先&#xf…

面试集中营—Redis面试题

一、Redis的线程模型 Redis是基于非阻塞的IO复用模型&#xff0c;内部使用文件事件处理器&#xff08;file event handler&#xff09;&#xff0c;这个文件事件处理器是单线程的&#xff0c;所以Redis才叫做单线程的模型&#xff0c;它采用IO多路复用机制同时监听多个socket&a…

Richard 林旅强:说说社区的故事和对 RTE 社区的畅想

各位 RTE 开发者社区的小伙伴们&#xff0c;大家好&#xff1a; 我是 Richard 林旅强&#xff0c;今年起开始担任我们 RTE 社区联合主理人&#xff0c;很荣幸能在这里跟杜金房老师和陈靖老师一起做点事情&#xff0c;为社区的大家服务 &#x1f603; 今天想跟各位分享&#x…

数据结构---动态数组

一、数据结构基本理论 数据结构是相互之间存在一种或多种特定关系的数据元素的集合。强调数据元素之间的关系 算法五个特性&#xff1a; 输入、输出、有穷、确定、可行 数据结构分类&#xff1a; 逻辑结构&#xff1a;集合、线性结构、树形结构、图形结构 物理…

Baidu Comate:你的智能编程伙伴,编程界的AI革命者

文章目录 Baidu Comate 介绍Baidu Comate下载安装Baidu Comate 实操体验代码解释函数注释行间注释调优建议生成单测注释生成实时续写常用快捷方式智能对话问答 Baidu Comate 建议改进Baidu Comate 体验总结 Baidu Comate 介绍 Baidu Comate 智能编码助手 是基于文心大模型&…

【nginx 开发】nginx安装,Nginx介绍

Nginx基础介绍 Nginx反向代理负载均衡动静分离 Nginx的安装NginxNginx常用命令Nginx配置文件 Nginx Nginx是一个高性能的Http和反向代理服务器&#xff0c;特点是占有内存少&#xff0c;并发能力强&#xff0c;Nginx可以作为静态页面的web服务器&#xff0c;Nginx专为性能优化…

4G工业路由器快递柜应用案例(覆盖所有场景)

快递柜展示图 随着电商的蓬勃发展,快递行业迎来高速增长。为提高快递效率、保障快件安全,智能快递柜应运而生。但由于快递柜部署环境复杂多样,网络接入成为一大难题。传统有线宽带难以覆盖所有场景,而公用WiFi不稳定且存在安全隐患。 星创易联科技有限公司针对这一痛点,推出了…

我独自升级崛起在哪下载 我独自升级崛起客户端下载教程

定于5月8日全球盛放的《我独自升级&#xff1a;崛起》——这一激动人心的动作角色扮演游戏巨作&#xff0c;汲取了同名动漫及网络漫画的精髓&#xff0c;誓将以其无与伦比的魅力&#xff0c;引领玩家迈入一个探索深远、规模宏大的奇幻之旅。游戏构筑在一个独一无二的网络武侠世…

JavaScript:正则表达式属于字符串吗-不属于/字符串转正则表达式的两种方法

一、需求描述 js 字符串转正则表达式 二、理解正则表达式属于字符串吗? 正则表达式不属于字符串&#xff0c;它是一种用于匹配、查找和操作文本的模式。正则表达式是一种特殊的语法&#xff0c;用于描述字符串的特征。通过使用正则表达式&#xff0c;可以检查一个字符串是否…

项目计划书(Word原件)

项目开发计划包括项目描述、项目组织、成本预算、人力资源估算、设备资源计划、沟通计划、采购计划、风险计划、项目过程定义及项目的进度安排和里程碑、质量计划、数据管理计划、度量和分析计划、监控计划和培训计划等。 软件资料清单列表部分文档&#xff1a; 工作安排任务书…

如何有效识别限界上下文?

在实施DDD的过程中&#xff0c;识别限界上下文是一大难点&#xff0c;但也并非无章可循。在本文内容中&#xff0c;我们将分别从业务维度、工作维度以及技术维度进行展开&#xff0c;讨论如何有效识别限界上下文的方法和技巧。 从业务维度识别限界上下文 从业务维度识别限界上…