Linux——主函数的三个参数,printf方法的隐藏缓冲区

主函数的三个参数

在windows下,c语言的主函数默认有两个参数;
很多人会惊奇,这是什么,好像从没有听说过????
我们在写C代码的时候都是习惯性的新建空项目然后自己添加.cpp文件,但是可能有部分人习惯直接新建控制台程序,然后可能就会看到这么一段代码,其实两个参数是负责接收指令行参数的,很多在linux gcc或者g++下编译过c程序的人都知道他的指令格式是:

	gcc 源文件名 -o 生成文件名

ps -f也是这个道理。
在Linux下,我们的主函数是有三个参数的:

int main(int argc,char *argv[],char * envp)
  • argc:主函数的参数个数
  • argv:主函数的参数内容
  • envp:环境变量(默认情况下,环境变量是从父进程继承而来的)

在这里插入图片描述
我们可以看到如下的执行结果:
在这里插入图片描述

也就是主函数拿到的第一个参数就是:当前程序的路径全名称

在这里插入图片描述
上述指令中,hello和123都是传给主函数的参数,都是以字符串的形式接收
因此,若写成下面的形式,参数就发生了变化:
在这里插入图片描述
我们加入环境变量的输出:
在这里插入图片描述
envp的最后一个参数是空指针。
如下图所示,显示了部分的环境变量:在这里插入图片描述
然后,我们增加一个自己的环境变量,命令如下:
在这里插入图片描述
在这里插入图片描述
总是,对于主函数参数的学习就到这里,实际上bash是main的父进程,bash帮我们把main进程运行起来,我们在bash中新增加了一个环境变量,所以main运行,会得到MYSTR这个环境变量。

printf方法的隐藏缓冲区

向屏幕输出显示信息时,C语言会使用printf方法,但实际上,它不会将输出结果直接输出到屏幕上,首先是将其要输出的内容写入到缓冲区中,待缓冲区放满后,就会把缓冲区的内容输出到屏幕上。
设立隐藏缓冲区的原因:
——效率,printf输出的内容要打印到屏幕上,是需要调用系统接口来完成的,屏幕是硬件设备,是由操作系统来管理的,因此它在输出时需要调用系统接口来完成,也就需要从用户态切换到内核态,如果我们多次调用printf,那么就会在这两种状态之间来回切换,造成很大的开销。
只有满足以下三种情况之一,才会将缓冲区中的内容输出到屏幕:

  1. 缓冲区满
  2. 强制刷新缓冲区fflush(stdout)或者加上\n
  3. 程序结束时
    在这里插入图片描述
    运行后,程序是先闪五秒空格才出现输出,原因是进程先刷新缓冲区再退出,调用exit(0)后,先刷新缓冲区,再调用_exit(0)(真正退出进程的方法),因为该方法只会退出进程,不会刷新缓冲区
    在这里插入图片描述
    若将代码修改为_exit(0)方法,则不会将缓冲区的内容输出到屏幕上,
    在这里插入图片描述
    若给printf后加上\n也会刷新缓冲区,同样强制刷新也可以输出到屏幕上:
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

小总结

  • 其实C语言中的标准IO函数(不仅仅是printf),都是具有缓存功能的;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值