诺亚方舟

沉淀

总结进程退出方式

在Linux操作系统中,退出进程分为正常退出和异常退出两种。正常退出和异常退出又包括好几种方法。

正常退出:

  • 在main函数中执行return;
  • 调用exit函数;
  • 调用_exit函数。

异常退出:

  • 调用abort函数;
  • 进程收到某个信号,而该信号使程序终止。

不管是哪种退出方式,最终都会执行内核中的同一段代码,这段代码用来关闭进程所有已打开的文件描述符,释放他所占用的内存和其他资源。以下是各种退出方式的比较:

exit和return的区别:exit是一个函数,有参数;而return是函数执行完后的返回。exit把控制权交给系统,而return把控制权交给调用函数,弹出一个函数栈,当在main中调用return时,函数栈会弹完;

exit和abort的区别:exit是正常终止进程,abort是异常终止。exit(int exit_code)参数为0时代表进程正常终止,当非0时表示执行过程中有错误发生,例如溢出,除数为0等;

exit()和_exit()的区别:exit在stdlib.h中声明,而_exit()在unistd.h中声明,两个函数均能正常终止进程,但是_exit()会执行后立即返回给内核,而exit()要先执行一些清除操作,然后把控制权返回给内核。

父子进程终止的先后顺序不同会产生不同的结果。在子进程退出前父进程先推出,则系统会让init进程接管子进程。但子进程先于父进程终止,而父进程有没有调用wait函数等待子进程结束,子进程进入僵死状态,并且会一直保持下去除非系统重启。子进程处于僵死状态时,内核只保存该进程的一些必要信息以备父进程所需。此时子进程始终占用着资源,同时也减少了系统可以创建的最大进程数。如果子进程先于父进程终止,而父进程调用了wait或waitpid函数,则父进程会等待子进程结束。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>