main函数返回给谁?
int main(void);
inr main(int argc , char **argv);
inr main(int argc , char *argv[]);
上面的是三种常用的main函数书写方式,main函数从某种程度代表了这整个程序,谁执行了这个程序,谁调用了main()。
执行一个新进程的本质:创建、加载、运行、消亡。在linux中可以用./xxx执行,用shell执行,用fork、exec执行,本质上是被父进程fork出来的。
命令行本质是一个进程,在命令行中通过./xxx fork了一个程序,成为了命令行的子进程,可见main()函数的返回值是返回给父进程,一般就返回一个执行结果,0表示成功,负数表示失败。
验证main()函数的返回值,写一个shell:
#! /bin/sh
./a.out
echo $?
source xxx.sh执行这个脚本。父进程调用子进程后用$?存储,表示上一个程序的返回结果。return返回值默认为int。
int main()
{
xxxx
return 0;
}
float main()
{
xxxx
return 0;
}
上面两个main()都会返回0,但float的0是错误的。当将return返回值改为123,int返回123,float返回0。
int main(int argc , char **argv);的参数解析:父进程给main()传参的原因灵活性问题。main(void)也可以,不必进行传参,大多数程序都可以。希望main()有灵活性,不进行重编译而改变运行结果。
给main()函数传参,通过C语言预定参数argc和argv实现。argc表示给mian传了几个参数,argv是一个字符串数组,用于存储字符串数组,每个字符串就是一个参数。argv[0]的第一个参数。
一个程序的argc默认为1,argv[0]默认为程序名:
int main(int argc , char* argv[])
{
printf("argc=%d",argc); 输出:argc=1
printf("argv[0]=%d",argv[0]); 输出:argv[0]=a.out
}
int main(int argc , char* argv[])
{
for(int i=0;i<argc;i++)
{
printf(“argv[i]=%d\n”,argv[i]);
}
printf(“argc=%d\n”,argc);
}
上面这个程序运行方式:/a.out abc 33 xx。
打印:/a.out
abc
33
xx
argc的值会自增。
程序调用的本质就是父进程fork为子进程,然后与一个进程绑定,去执行(exec函数族),在exec时进行参数传递,程序调用被参数传递,是操作系统支持的。
注意main()传参,传的是字符串,在程序内部用argv时,一定会检测argc,传的参数个数不对时会报错。
./calculator 3 + 5
argc=4
argv[0]="calculator"
argv[1]="3"
argv[2]="+"
argv[3]="5"