Linux 第二十二章

news2024/11/22 18:55:26

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

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

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

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

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

相关文章

基于FPGA的累加器及数码管显示VHDL代码Quartus仿真

名称&#xff1a;基于FPGA的累加器及数码管显示VHDL代码Quartus仿真&#xff08;文末获取&#xff09; 软件&#xff1a;Quartus 语言&#xff1a;VHDL 代码功能&#xff1a; 累加器及数码管显示 1、可以通过按键输入1~9 2、数字输入后进行累加&#xff0c;将累加结果显示…

Day 26 数据库日志管理

数据库日志管理 一&#xff1a;日志管理 1.日志分类 ​ 错误日志 &#xff1a;启动&#xff0c;停止&#xff0c;关闭失败报错。rpm安装日志位置 /var/log/mysqld.log ​ 通用查询日志&#xff1a;所有的查询都记下来 ​ 二进制日志&#xff1a;实现备份&#xff0c;增量备份…

rockchip sensors da215s适配

一 、 RK3568 da215s适配 ,增加一个新的 sensor 驱动需做一些适配工作。 SOC&#xff1a;RK3568 KERNEL&#xff1a;Android 12 二、 Android sensors 架构 三、 Sensors hal 与 kernel driver 的通信框图 四、 Rockchip sensors hal 介绍 代码路径&#xff1a; hardw…

RapidJSON介绍

1.简介 RapidJSON 是一个 C 的 JSON 解析库&#xff0c;由腾讯开源。 支持 SAX 和 DOM 风格的 API&#xff0c;并且可以解析、生成和查询 JSON 数据。RapidJSON 快。它的性能可与strlen() 相比。可支持 SSE2/SSE4.2 加速。RapidJSON 独立。它不依赖于 BOOST 等外部库。它甚至…

上位机图像处理和嵌入式模块部署(树莓派4b镜像烧录经验总结)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 陆陆续续也烧录了好多次树莓派的镜像了&#xff0c;这里面有的时候很快&#xff0c;有的时候很慢。特别是烧录慢的时候&#xff0c;也不知道是自己…

crossover怎么打开软件 mac怎么下载steam crossover下载的软件怎么运行

CrossOver是一款Mac和Linux平台上的类虚拟机软件&#xff0c;通过CrossOver可以运行Windows的可执行文件。如果你是Mac用户且需要使用CrossOver&#xff0c;但是不知道CrossOver怎么打开软件&#xff0c;如果你想在Mac电脑上玩Windows游戏&#xff0c;但不知道怎么下载Steam&am…

大模型改变了哪些工作方式?

大模型的崛起深刻改变了我们的工作方式。如今&#xff0c;许多行业已广泛应用大型机器学习模型&#xff0c;实现了自动化数据处理、智能决策和高效分析。这一变革不仅释放了大量人力资源&#xff0c;使得人们能够专注于更具创造性的任务&#xff0c;还大幅提升了工作效率和准确…

【mobx-入门与思考】

介绍 mobx 是 nodejs生态中的框架&#xff0c; 主要用于做状态管理&#xff0c;可以监控变量状态的变化。 nodejs中除了mobx&#xff0c;还有个redux&#xff0c;也是做状态管理的&#xff0c;都是比较成熟的框架&#xff0c;二者的选择可以参考 【nodejs状态管理: Redux VS M…

录屏软件哪个好用?这4款不容错过!

在现代社会中&#xff0c;信息的传递和分享变得越来越重要。一个好的录屏软件能够帮助我们将想要分享的信息快速直观地展示给他人。 通过下文推荐的4款录屏软件&#xff0c;我们可以轻松地分享自己的知识、经验和见解&#xff0c;让更多的人受益。 方法一&#xff1a;QQ软件进…

服务器2080ti驱动的卸载与安装

服务器2080ti驱动的卸载与安装 前言1、下载驱动2、驱动卸载与安装2.1 卸载原来驱动2.2 安装新驱动 3、查看安装情况 前言 安装transformers库&#xff0c;运行bert模型时出错&#xff0c;显示torch版本太低&#xff0c;要2.0以上的&#xff0c;所以更新显卡驱动&#xff0c;重…

基于FPGA的数字电子钟VHDL代码Quartus仿真

名称&#xff1a;基于FPGA的数字电子钟VHDL代码Quartus仿真&#xff08;文末获取&#xff09; 软件&#xff1a;Quartus 语言&#xff1a;VHDL 代码功能&#xff1a; 数字电子钟 1)设计一个能显示秒、分、时的24小时数字钟 2)用数码管显示出时&#xff0c;分&#xff0c;…

MFC列表控件用ADO添加数据实例

1、本程序基于前期我的博客文章《MFC用ADO连接ACESS数据库实例(免费源码下载)》 程序功能通过编辑框、组合框实时将数据写入ACESS数据库并在列表控件上显示。 2、在主界面资源视图上加上一个按钮控件、两个静态文本、一个编辑框IDC_EDIT1变量名name、一个组合框IDC_COMBO1变量名…

网络机顶盒哪个好?2024畅销网络机顶盒排行榜

因买网络机顶盒踩雷的人不在少数&#xff0c;许多不懂网络机顶盒哪个好的消费者在挑选时会参考网络机顶盒排行榜&#xff0c;这次小编带来了业内最新发布的热销网络机顶盒排行榜&#xff0c;想买网络机顶盒可以看看入围的以下品牌&#xff0c;是目前最受消费者欢迎的品牌。 一&…

参数配置不生效导致海思1151芯片TPC功率超大,引起性能恶化。

• 【Wi-Fi领域】【现网案例4】参数配置不生效导致海思1151芯片TPC功率超大&#xff0c;引起性能恶化。 【问题描述】XXX客户反馈OLT-HG8245W5-6T–Wi-Fi–WA8021V5-LAN-PC组网概率出现近距离测速只有20Mbps 【问题单】DTS2022101410914 【问题分析】 在客户反馈此问题后&#…

面试集中营—JVM篇

一、JVM内存模型 线程独占&#xff1a;栈&#xff0c;本地方法栈&#xff0c;程序计数器; 线程共享&#xff1a;堆&#xff0c;方法区 虚拟机栈&#xff1a;线程私有的&#xff0c;线程执行方法是会创建一个栈阵&#xff0c;用来存储局部变量表&#xff0c;操作栈&#xff0c;…

W801学习笔记二十二:英语背单词学习应用——下

续上篇&#xff1a; W801学习笔记二十一&#xff1a;英语背单词学习应用——上 五、处理用户交互 由于英语也是采用了和唐诗一样的《三分钟限时挑战》《五十题竞速挑战》《零错误闯关挑战》&#xff0c;所以用户交互的逻辑和唐诗是一样的。所以&#xff0c;我们抽一个基类&a…

高级数据结构与算法习题(9)

一、判断题 1、Let S be the set of activities in Activity Selection Problem. Then the earliest finish activity am​ must be included in all the maximum-size subset of mutually compatible activities of S. T F 解析:F。设S是活动选择问题中的一…

Golang Map类型

文章目录 Map介绍Map的定义方式Map的增删查改新增和修改Map元素查找Map元素删除Map元素遍历Map元素 Map元素排序Map切片 Map介绍 Map介绍 在Go中&#xff0c;map是哈希表的引用&#xff0c;是一种key-value数据结构。map类型写作map[K]V&#xff0c;其中K和V分别对应key和value…

深度学习之基于Tensorflow卷积神经网络智能体操健身系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着人们健康意识的提高和数字化技术的快速发展&#xff0c;智能健身系统逐渐成为健身领域的新趋势。…

为什么不建议在 Vue <style> 中使用 scoped?

前言 亲爱的小伙伴&#xff0c;你好&#xff01;我是 嘟老板。我们使用 Vue 开发页面时&#xff0c;经常需要在 <style> 标签下编写样式。不知你是否留意&#xff0c;在 <style> 标签下有一个属性经常出现 - scoped。你知道它起到什么作用吗&#xff1f;原理是怎样…