上次讲了:Linux:进程概念(三.详解进程:进程状态、优先级、进程切换与调度)
在编写C/C++代码,我们通常都不会写main()函数的参数,但是在Linux下,main函数是可以带参数的
main()
函数是 C 和 C++ 程序中的入口函数,通常用于表示程序的起始点。在 C 和 C++ 中,main()
函数可以有两种不同的形式:
在标准的 C 语言中,main()
函数通常定义为:
int main(void) //我们一般什么都不写
{
// 函数体
return 0;
}
这种形式的 main()
函数没有参数,返回一个整数值作为程序的退出状态码。
在一些特定的环境中(如 UNIX/Linux 系统),main()
函数也可以带有两个参数,用于传递命令行参数:
int main(int argc, char *argv[])
{
// 函数体
return 0;
}
argc
是一个整数,表示命令行参数的数量(包括程序名本身)(就是说,argc也是argv这个数组里元素个数)。char *argv[]
是一个字符数组;argv
是一个指向字符指针数组的指针,每个指针指向一个以 null 结尾的字符串,表示一个命令行参数。#include<stdio.h>
#include<unistd.h>
#include<sys/types .h>
int main(int argc, char* argv[])
{
for (int i = 0; i < argc; i++)
{
printf("%s\n", argv[i]);
}
return 0;
}
#include<stdlib.h>
#include<stdio.h>
int main(int argc, char* argv[])
{
if (argc == 4)
{
int a = atoi(argv[2]);//字符串转int
int b = atoi(argv[3]);//字符串转int
if (strcmp(argv[1], "-add") == 0)
{
printf("%d+%d=%d\n", a, b, a + b);
}
else if (strcmp(argv[1], "-sub") == 0)
{
printf("%d-%d=%d\n", a, b, a - b);
}
else if (strcmp(argv[1], "-mul") == 0)
{
printf("%d*%d=%d\n", a, b, a * b);
}
else
{
printf("%d/%d=%d\n", a, b, a / b);
}
}
else
{
printf("used wrongly:please ./code.c [add][sub][mul][div] num1 num2");
return 1;
}
return 0;
}
我们在运行程序时,一般使用**
./myprograme
**(相对路径,本目录下的myprog) 或者直接使用绝对路径。如果什么都不加,直接**myprograme
**,是找不到的。但是使用系统的指令时,就能直接找的 这是因为存在一个全局的环境变量:PATH
cd
命令时,如果没有指定目标目录,则系统会切换到 HOME 目录。/bin/bash
,表示用户正在使用 Bash Shell。其他常见的 Shell 包括 /bin/sh
、/bin/zsh
等。echo
用于打印输出文本或变量的内容到标准输出(通常是终端)。基本语法:
echo [选项] [字符串/变量]
选项: echo
可以接受一些选项来改变其行为,常见的选项包括:
-n
:不换行输出。-e
:启用转义字符的解析,可以让 echo
打印一些特殊字符,如换行符 \n
、制表符 \t
等。-E
:禁用转义字符的解析,将反斜杠 \
作为普通字符处理。echo $PATH
美元符号
$
通常用于引用环境变量的值,如果不加那只是把PATH当成字符串
那么当我们想直接用文件名就能执行我们自己的代码时,有两种方法:
PATH=自己代码路径:$PATH
如果不加
:PATH
,那么PATH会直接被覆盖,只有自己代码的路径
echo: 显示某个环境变量值
export: 设置一个新的环境变量
export [变量名]=[赋值]
可以设置一个名为“变量名”的环境变量,并赋予其值为“赋值”
env: 显示所有环境变量
unset: 清除环境变量
set: 显示本地定义的shell变量和环境变量
直接使用
变量名=赋值
我们这样就能创建一个本地变量,本地变量不能继承。只能在bash里使用
可以使用unset清楚环境变量和本地变量
#include <stdio.h>
int main(int argc, char* argv[], char* envp[])
{
printf("环境变量列表:\n");
for (int i = 0; envp[i] != NULL; i++)
{
printf("%s\n", envp[i]);
}
return 0;
}
数组的最后一个元素是一个空指针,用于表示环境变量数组的结束
getenv
函数用于获取指定环境变量的值。它的原型定义在 <stdlib.h>
头文件中:
char *getenv(const char *name);
参数 name
是要获取的环境变量的名称,函数返回该环境变量的值。如果环境变量不存在,则返回 NULL
。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char* path = getenv("USER");
if (path != NULL)
{
printf("USER: %s\n", path);
}
else
{
printf("USER environment variable not found.\n");
}
return 0;
}
在 C 语言中,environ
是一个全局变量,用于存储当前进程的环境变量。它通常定义在 <unistd.h>
头文件中。environ
是一个指向字符串数组的指针,每个字符串都表示一个环境变量。
#include <stdio.h>
#include <unistd.h>
extern char** environ;
int main()
{
char** env = environ;
while (*env != NULL)
{
printf("%s\n", *env);
env++;
}
return 0;
}
extern
是 C 语言中的一个关键字,用于声明一个变量或函数,表明该变量或函数是在其他文件中定义的,当前文件中只是引用了它。 `extern char environ;** **表示声明了一个全局变量** **
environ`**,并表明该变量在当前文件中并没有定义,而是在其他文件中定义的。
putenv
是 C 语言中的一个库函数,它定义在 <stdlib.h>
头文件中。这个函数用于将字符串添加到环境变量中,或者修改已经存在的环境变量的值。
函数原型如下:
int putenv(const char *string);
这里的 string
是一个指向以 null 结尾的字符串的指针,该字符串的格式应该是 name=value
,其中 name
是环境变量的名称,value
是环境变量的值。
如果 string
指向的字符串成功添加到环境变量中,或者成功修改了已经存在的环境变量的值,那么 putenv
函数返回 0。如果发生错误,返回非零值。
注意,putenv
函数会修改其参数指向的字符串。因此,如果你不希望原始字符串被修改,你应该传递一个字符串的副本给 putenv
。此外,由于 putenv
可能会修改环境变量,这可能会影响到程序中其他部分的行为,因此在多线程环境中使用时需要特别注意。
我们首先要知道:环境变量确实属于 shell 进程的上下文。当用户退出登录时,shell 进程会结束,从而导致环境变量也随之消失。每次重新登录后,新的 shell 进程会启动,并加载相应的配置文件(如 .bash_profile
、.bashrc
等),从而重新设置环境变量,使其生效
这里也能解释为什么我们每次登陆时,都是进到用户对应的默认目录:这样才能读取到相应的.bash_profile文件
今天就到这里啦!!!