目录
1.主函数的前两个参数
编辑
2.环境变量
3.envp,argv都是以NULL作为结尾的
4.printf隐藏的缓冲区
(1)目的
(2)环境变量
(3)缓冲区的存在
(4)强制刷新
(5)_exit与exit
1.主函数的前两个参数
argc argv envp main
shell 壳
#include<stdio.h>
int main(int argc,char*argv[],char*envp[])
{
int i=0;
printf("argc=%d\n",argc);
//for(;i<argc;i++)
//{
// printf("argv[%d]=%s\n",i,argv[i]);
//}
for(;argv[i]!=NULL;i++)
{
printf("argv[%d]=%s\n",i,argv[i]);
}
for(i=0;envp[i]!=NULL;i++)
{
printf(envp[%d]=%s\n",i,envp[i]);
}
return 0;
}
![](https://img-blog.csdnimg.cn/abf1ec6bc2054463902ad2ddba2d149f.png)
argc:个数
argv:数组内容
envp:环境变量
envp、argv都是以NULL作为结尾
2.环境变量
envp是由父进程继承过来的参数;
环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数;
for(i=0;envp[i]!=NULL;i++)
{
printf(envp[%d]=%s\n",i,envp[i]);
}
3.envp,argv都是以NULL作为结尾的
for(;argv[i]!=NULL;i++)
{
printf("argv[%d]=%s\n",i,argv[i]);
}
4.printf隐藏的缓冲区
![](https://img-blog.csdnimg.cn/1c1df8d86caa4794b59de6181c695dbc.png)
(1)目的
1.提高效率;
2.用户态切换到内核态;(有缓冲区,减少切换次数)
3.开销比较大
用户:在用户态
打印:在内核
(2)演示缓冲区没有存在感
#include <stdio.h>
int main()
{
printf("hello");
}
(3)缓冲区的存在
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
printf("hello");
sleep(3);
exit(0);
}
(4)强制刷新
(1)方法一:遇到\n自动刷新
(2)使用fflush刷新屏幕
fflush(stdout);
(5)_exit与exit
_exit与exit
exit是先刷新缓冲区,然后再调用_exit(真正的退出)
_exit:直接退出,不会刷新缓冲区
(6)总结
printf:将内容先写到缓冲区中,缓冲区刷新到界面(屏幕)上的条件是:
(1)缓冲区放满
(2)缓冲区未满,强制刷新缓冲区到屏幕(\n或者fflush(stdout))
(3)程序结束时,自动刷新缓冲区,exit方法