目录
一、代码运行结果现象
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<stdlib.h>
4
5 //
6 //_exit()
7 int main()
8 {
9 printf("you can see me?");
10 //先sleep3秒 程序退出
11 printf("you can see me?\n");
12 //先刷新到显示屏 再sleep3秒 程序退出
13 sleep(3);
14 _exit(10);
15 return 0;
16 }
17
18
19 //
20 //exit()
21 //int main()
22 //{
23 // printf("you can see me?");
24 // //先sleep3秒 最后刷新到显示屏
25 // printf("you can see me?\n");
26 // //先刷新到显示屏 再sleep3秒
27 // sleep(3);
28 // exit(10);
29 // return 0;
30 //}
31 //
解释现象:
1、当调用exit()函数终止程序时,如果是 printf("you can see me?"); 语句,该语句没有加'\n',程序会先sleep3秒,再把you can see me 语句显示到显示屏上,再退出程序。
2、当调用exit()函数终止程序时,如果是 printf("you can see me?\n"); 语句,该语句添加了'\n',程序会把you can see me 语句显示到显示屏上,再sleep3秒,再退出程序。
3、当调用_exit()函数终止程序时,如果是 printf("you can see me?"); 语句,该语句没有加'\n',程序会先sleep3秒,直接退出程序,不会把 you can see me语句显示到显示屏上。
4、当调用_exit()函数终止程序时,如果是 printf("you can see me? \n"); 语句,该语句添加了'\n',程序会先把 you can see me语句显示到显示屏上,再sleep3秒,再退出程序。
二、exit()函数和_exit()函数的区别
1、exit()函数是库函数的调用接口
exit()函数是库函数维护的,库的调用接口,程序要退出时,当缓冲却区内有数据时,退出程序的时候会把数据刷新到显示屏上
2、_exit()函数是操作系统调用接口
_exit()函数是操作系统调用接口,操作系统维护的,不加换行符\n时,并不会将数据刷新到显示屏上,而是直接终止程序。
3、exit()和_exit()的关联关系
exit()底层调用的是_exit()函数,不加换行符'\n'时直接调用_exit()数据并没有刷新出来,而是调用exit()函数数据刷新出来了,由此可以知道缓冲区一定不是OS维护的,而是exit()函数维护的。
因此exit()函数将程序终止前,会把执行用户相关的清理函数,以及刷新缓冲区,关闭流等等。