一、main 函数的标准参数
在 C 语言中,main 函数最完整、最标准的写法是:
c
运行
int main(int argc, char *argv[], char *envp[]);
一共 3 个参数:
argc:命令行参数的个数argv:命令行参数的字符串数组envp:环境变量字符串数组(系统传给进程的环境变量)
二、argc & argv 到底是什么?
先看最基础的代码:
c
运行
#include<stdio.h>
int main(int argc, char *argv[]) {
printf("argc: %d\n", argc);
int i = 0;
for (; i < argc; ++i) {
printf("argv[%d] -> %s\n", i, argv[i]);
}
return 0;
}
核心结论
argc= 命令行参数的数量argv= 字符串数组,存的是你在终端敲的每一段内容argv[0]固定是 程序名(路径)argv[argc] = NULL(系统规定)
例子
你运行:
plaintext
./main hello world 123
输出:
plaintext
argc: 4
argv[0] -> ./main
argv[1] -> hello
argv[2] -> world
argv[3] -> 123
三、为什么命令行需要参数?
因为 Linux 所有命令都是靠 main 参数实现不同功能的!
比如:
plaintext
ls -l -a
cp file1 file2
rm -rf test
这些命令的 -l/-a/-rf 本质都是 argv[] 里的字符串。
命令行参数的作用:让一个程序根据不同选项执行不同逻辑。
四、argc & argv 三个必须记住的点
-
argc 最小一定是 1,因为至少有程序名
argv[0] -
参数之间以 空格分隔
-
argv[argc] = NULL,所以循环可以写成:c
运行
for(i=0; argv[i]; i++)
环境变量(超级重点)
1. 为什么自己的程序必须 ./main 才能运行?
系统命令(ls、cp、pwd)都在 /usr/bin 目录下。系统会去 PATH 环境变量 包含的路径里找命令。
你自己的程序不在 PATH 里,所以必须加路径:
plaintext
./main
解决方案(两种)
-
把程序拷贝到
/usr/bin(不推荐,污染系统) -
把当前路径追加到 PATH(推荐)
bash
运行
export PATH=$PATH:.
之后就可以直接:
plaintext
main
2. 环境变量 PATH 是什么?
PATH 是一串用 冒号:分隔 的路径。
当你输入命令时,系统会依次去这些路径找可执行文件。
查看 PATH:
bash
运行
echo $PATH
3. 环境变量从哪来?
-
环境变量存储在 bash 进程 中
-
bash 启动时从配置文件读取:
~/.bashrc/etc/profile
-
环境变量是内存级的,重启终端就会恢复默认
4. 环境变量的传递规则
环境变量由父进程传递给子进程!
- bash 是父进程
- 你的 ./main 是 bash 的子进程
- 子进程默认继承父进程的环境变量
- 所以环境变量具有全局性
在 C 程序中获取环境变量(3 种方法)
方法 1:main 第三个参数 envp []
c
运行
#include <stdio.h>
int main(int argc, char *argv[], char *envp[]) {
int i=0;
for(; envp[i]; i++) {
printf("%s\n", envp[i]);
}
return 0;
}
方法 2:全局变量 environ
c
运行
#include <stdio.h>
int main() {
extern char** environ;
int i=0;
for(; environ[i]; i++) {
printf("%s\n", environ[i]);
}
return 0;
}
方法 3:getenv () 最实用(推荐)
c
运行
#include<stdio.h>
#include<stdlib.h>
int main() {
char* user = getenv("USER");
printf("当前用户:%s\n", user);
return 0;
}
常用环境变量:
- USER:当前用户名
- PATH:可执行文件搜索路径
- HOME:家目录
- PWD:当前路径
- HISTSIZE:历史命令最大条数
- SHELL:当前 shell
本地变量 vs 环境变量
本地变量
- 只在当前 bash 有效
- 不能被子进程继承
- 不是环境变量
定义:
bash
运行
MYVAR=123
环境变量
- 可以被子进程继承
- 具有全局性
把本地变量导出成环境变量:
bash
运行
export MYVAR
删除环境变量:
bash
运行
unset MYVAR
最终总结(最核心)
main(int argc, char *argv[])是 Linux 命令的实现基础argv[0]= 程序名,argc >= 1- 环境变量来自父进程 bash,具有全局继承性
- 获取环境变量最常用:
getenv() export将本地变量变环境变量unset删除环境变量- PATH 决定了你能不能直接运行命令