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是语言级别的,表示调用堆栈的返回