main主程序隐藏的三个参数与printf隐藏的缓冲区

main主程序隐藏的三个参数

  • argc 主函数的参数个数

  • argv 字符数组 存放参数内容

  • envp 字符数组 存放环境变量 (envp是由父进程继承过来的参数)

注: argv envp 均为指针数组,且都是以NULL作为结尾的

在这里插入图片描述
程序输出结果:

在这里插入图片描述

printf隐藏的缓冲区

缓冲区内容刷新到屏幕上的条件:

1. 缓冲区已满

2. 缓冲区未满,强制刷新缓冲区(\n 或 fflush(stdout))

3. 程序结束时,自动刷新缓冲区(退出函数:exit(), _exit(), return)

示例一:
在这里插入图片描述
程序输出结果:

在这里插入图片描述

/n 刷新缓冲区打印两个helloworld 换行之后 fflush(stdout)刷新缓冲区,打印两个 helloworld ,等待睡眠五秒后, 程序结束前刷新缓冲区,打印最后两个helloworld

示例二:

在这里插入图片描述

程序输出结果:
在这里插入图片描述
/n 刷新缓冲区打印两个helloworld 换行之后 fflush(stdout)刷新缓冲区,打印两个 helloworld ,exit(0) 正常退出程序前,刷新缓冲区,打印一个 helloworld,最后一个printf 和 sleep 函数 没有调用运行

示例三:

在这里插入图片描述

程序输出结果:

在这里插入图片描述
/n 刷新缓冲区打印两个helloworld 换行之后 fflush(stdout)刷新缓冲区,打印两个 helloworld ,_exit(0) 正常退出程序前,不刷新缓冲区,不打印缓冲区的那个 helloworld,最后一个printf 和 sleep 函数 没有调用运行

示例四:

在这里插入图片描述

程序输出结果:

在这里插入图片描述
/n 刷新缓冲区打印两个helloworld 换行之后 fflush(stdout)刷新缓冲区,打印两个 helloworld ,_exit(0) 正常退出程序前,利用fflush(stdout) 刷新缓冲区,打印一个helloworld,最后一个printf 和 sleep 函数 没有调用运行

exit() 相当于 fflush(stdout) _exit()

exit() 和 _exit() 的区别:

  • exit() 是普通函数库中一个函数 ,_exit() 是一个 sys_exit 的系统调用

  • exit() :先刷新缓冲区,然后调用_exit();
    _exit():不会刷新缓冲区,直接结束进程
    (具体可参考上述示例二和示例三)

  • exit()_exit() 就是用来正常终止一个进程的,主要区别是 _exit() 会立刻进入内核,而 exit() 先执行一些清除工作(包括执行各种终止处理程序,关闭所有标准I/O等,一旦关闭了IO,例如Printf等函数就不会输出任何东西了),然后才进入内核。这两个函数会对父子进程有一定的影响,当用fork创建子进程时,子进程会先在父进程的地址空间运行(这跟fork不一样),如果子进程调用了exit() 就会把父进程的IO给关掉

exit和return区别:

  • exit:结束整个程序(进程退出):
    exit(0) :正常运行程序并退出程序
    exit(1):非正常运行导致退出程序

    return:某个函数结束,并返回结果

  • exit: 是一个函数。return 是一个关键字

  • exit:是一个系统级别的调用,表示一个进程的结束。
    return是语言级别的,表示调用堆栈的返回

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值