main函数参数,环境变量

Aki 发布于 2023-01-16 285 次阅读


我们经常写的main函数是不带变量的,但是实际上main函数可以带三个变量:

  • int main(int argc, char* argv[], char* envp[])
  • argc 主函数的参数个数
  • argv 主函数的参数内容
  • envp 环境变量
#include<iostream>
using namespace std;


int   main(int   argc, char* argv[], char* env[])
{
	cout << "argc---------------------------------------------------------------------------------------" << endl;
	cout << "argc = " << argc << endl;

	cout << "argv-------------------------------------------------------------------------------- -------" << endl;
	int   i;
	for (i = 0; i < argc; i++)
	{
		cout << "argv[" << i << "] = " << argv[i] << endl;
	}

	cout << "env-----------------------------------------------------------------------------------------" << endl;
	for (i = 0; env[i] != NULL; i++)
	{
		cout << "envp[" << i << "] = " << env[i] << endl;
	}
	cout << "env--------------------------------------------------------------------------------- -------" << endl;
	return   0;
}

在linux系统上执行上述代码后得到一堆信息:

[root@VM-4-7-centos test]# ./main  1 2 3 4 56 7 8 9 hello

argc---------------------------------------------------------------------------------
argc = 10
argv-------------------------------------------------------------------------------- 
argv[0] = ./main
argv[1] = 1
argv[2] = 2
argv[3] = 3
argv[4] = 4
argv[5] = 56
argv[6] = 7
argv[7] = 8
argv[8] = 9
argv[9] = hello
env--------------------------------------------------------------------------------- 
envp[0] = LS_COLORS=rs=0:di=38;5;33:ln=38;5;51:mh=00:pi=40;38;5;11:so=38;5;13:do=38;5;5:bd=48;5;232;38;5;11:cd=48;5;232;38;5;3:or=48;5;232;38;5;9:mi=01;05;37;41:su=48;5;196;38;5;15:sg=48;5;11;38;5;16:ca=48;5;196;38;5;226:tw=48;5;10;38;5;16:ow=48;5;10;38;5;21:st=48;5;21;38;5;15:ex=38;5;40:*.tar=38;5;9:*.tgz=38;5;9:*.arc=38;5;9:*.arj=38;5;9:*.taz=38;5;9:*.lha=38;5;9:*.lz4=38;5;9:*.lzh=38;5;9:*.lzma=38;5;9:*.tlz=38;5;9:*.txz=38;5;9:*.tzo=38;5;9:*.t7z=38;5;9:*.zip=38;5;9:*.z=38;5;9:*.dz=38;5;9:*.gz=38;5;9:*.lrz=38;5;9:*.lz=38;5;9:*.lzo=38;5;9:*.xz=38;5;9:*.zst=38;5;9:*.tzst=38;5;9:*.bz2=38;5;9:*.bz=38;5;9:*.tbz=38;5;9:*.tbz2=38;5;9:*.tz=38;5;9:*.deb=38;5;9:*.rpm=38;5;9:*.jar=38;5;9:*.war=38;5;9:*.ear=38;5;9:*.sar=38;5;9:*.rar=38;5;9:*.alz=38;5;9:*.ace=38;5;9:*.zoo=38;5;9:*.cpio=38;5;9:*.7z=38;5;9:*.rz=38;5;9:*.cab=38;5;9:*.wim=38;5;9:*.swm=38;5;9:*.dwm=38;5;9:*.esd=38;5;9:*.jpg=38;5;13:*.jpeg=38;5;13:*.mjpg=38;5;13:*.mjpeg=38;5;13:*.gif=38;5;13:*.bmp=38;5;13:*.pbm=38;5;13:*.pgm=38;5;13:*.ppm=38;5;13:*.tga=38;5;13:*.xbm=38;5;13:*.xpm=38;5;13:*.tif=38;5;13:*.tiff=38;5;13:*.png=38;5;13:*.svg=38;5;13:*.svgz=38;5;13:*.mng=38;5;13:*.pcx=38;5;13:*.mov=38;5;13:*.mpg=38;5;13:*.mpeg=38;5;13:*.m2v=38;5;13:*.mkv=38;5;13:*.webm=38;5;13:*.ogm=38;5;13:*.mp4=38;5;13:*.m4v=38;5;13:*.mp4v=38;5;13:*.vob=38;5;13:*.qt=38;5;13:*.nuv=38;5;13:*.wmv=38;5;13:*.asf=38;5;13:*.rm=38;5;13:*.rmvb=38;5;13:*.flc=38;5;13:*.avi=38;5;13:*.fli=38;5;13:*.flv=38;5;13:*.gl=38;5;13:*.dl=38;5;13:*.xcf=38;5;13:*.xwd=38;5;13:*.yuv=38;5;13:*.cgm=38;5;13:*.emf=38;5;13:*.ogv=38;5;13:*.ogx=38;5;13:*.aac=38;5;45:*.au=38;5;45:*.flac=38;5;45:*.m4a=38;5;45:*.mid=38;5;45:*.midi=38;5;45:*.mka=38;5;45:*.mp3=38;5;45:*.mpc=38;5;45:*.ogg=38;5;45:*.ra=38;5;45:*.wav=38;5;45:*.oga=38;5;45:*.opus=38;5;45:*.spx=38;5;45:*.xspf=38;5;45:
envp[1] = SSH_CONNECTION=110.73.147.176 58526 10.0.4.7 22
envp[2] = LANG=en_US.utf8
envp[3] = HISTTIMEFORMAT=%F %T 
envp[4] = HOSTNAME=VM-4-7-centos
envp[5] = which_declare=declare -f
envp[6] = XDG_SESSION_ID=7765
envp[7] = USER=root
envp[8] = PWD=/root/test
envp[9] = HOME=/root
envp[10] = SSH_CLIENT=110.73.147.176 58526 22
envp[11] = SSH_TTY=/dev/pts/0
envp[12] = MAIL=/var/spool/mail/root
envp[13] = TERM=xterm-256color
envp[14] = SHELL=/bin/bash
envp[15] = SHLVL=1
envp[16] = PROMPT_COMMAND=history -a; history -a; history -a; 
envp[17] = LOGNAME=root
envp[18] = DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/0/bus
envp[19] = XDG_RUNTIME_DIR=/run/user/0
envp[20] = PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
envp[21] = DEBUGINFOD_URLS=https://debuginfod.centos.org/ 
envp[22] = HISTSIZE=3000
envp[23] = LESSOPEN=||/usr/bin/lesspipe.sh %s
envp[24] = BASH_FUNC_which%%=() {  ( alias;
 eval ${which_declare} ) | /usr/bin/which --tty-only --read-alias --read-functions --show-tilde --show-dot $@
}
envp[25] = _=./main
envp[26] = OLDPWD=/root
env--------------------------------------------------------------------------------- 

argc是执行程序时的命令行参数个数。需要注意的是,程序本身的文件也算一个。比如你写了个程序叫ex,若用下面的命令行启动:./ex

那么argv[0] = ./ex,如果启动命令是 ./ex -s -t hello,world,那么argv[0] = ./ex,argv[1] = -s ......依次类推

envp是环境变量,理论上讲,环境变量来自父进程的继承。一个进程有很多个环境变量参数,输出了一大堆信息。envp是一个以nullptr为最后一个元素的指针数组。