面试题答案
一键面试1. exit()
- 函数原型:
void exit(int status);
- 功能:用于正常终止一个进程。它会执行以下操作:
- 清理缓冲区:调用所有已注册的终止处理函数(通过
atexit()
函数注册)。同时,会刷新所有标准I/O流(stdio库中的流,如stdout
、stdin
、stderr
)的缓冲区,将缓冲区中的数据输出到相应的设备(例如,将stdout
缓冲区的数据输出到屏幕)。 - 返回状态:向父进程返回一个状态值
status
,父进程可以通过wait()
或waitpid()
等函数获取这个状态值,以了解子进程的退出情况。 - 进程终止:完成上述操作后,调用
_exit()
函数来最终终止进程。
- 清理缓冲区:调用所有已注册的终止处理函数(通过
2. _exit()
- 函数原型:
void _exit(int status);
- 功能:直接使进程终止。与
exit()
不同,它不会执行以下操作:- 清理缓冲区:不会调用任何终止处理函数,也不会刷新标准I/O流的缓冲区。这意味着,如果在调用
_exit()
之前有数据写入了标准I/O缓冲区但尚未输出,这些数据将会丢失。 - 直接终止:直接将进程的状态传递给内核,由内核来完成进程的清理和资源回收工作,向父进程返回状态值
status
。
- 清理缓冲区:不会调用任何终止处理函数,也不会刷新标准I/O流的缓冲区。这意味着,如果在调用
3. return语句
- 使用场景:在
main()
函数中,return
语句与exit()
函数有相似的效果。 - 功能:当在
main()
函数中执行return
语句时,实际上会被转换为对exit()
函数的调用。例如:
int main() {
return 0;
}
相当于:
int main() {
exit(0);
}
因此,在main()
函数中使用return
会执行与exit()
相同的清理缓冲区、调用终止处理函数以及向父进程返回状态值的操作。但在其他非main()
函数中,return
只是从当前函数返回,并不会终止整个进程。
总结
- exit():适合需要进行标准I/O缓冲区清理和执行终止处理函数的场景,常用于正常的进程结束。
- _exit():适用于需要立即终止进程,且不在乎标准I/O缓冲区内容是否刷新的情况,如在子进程执行
exec
系列函数之前,通常先调用_exit()
来确保干净地终止当前进程,避免一些潜在问题。 - return(在main()中):方便简洁,效果与
exit()
类似,推荐在main()
函数中使用以正常结束进程。