栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

进程和线程的退出

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

进程和线程的退出

一、孤儿进程和僵尸进程 1)孤儿进程
  • 失去父进程的子进程就叫做孤儿进程,孤儿进程的产生是由于父进程不等待子进程退出,即父进程在子进程之前就结束了自己的“生命”。
  • Linux系统避免存在过多的孤儿进程,init(pid=1)进程会”领养“孤儿进程,变成init的父进程。

init进程,它是内核启动的第一个用户级进程。init有许多很重要的任务,比如像启动getty(用于用户登录)、实现运行级别、以及处理孤立进程。

当内核启动了自己之后(已被装入内存、已经开始运行、已经初始化了所有的设备驱动程序和数据结构等等),通过启动用户级程序init来完成引导进程的内核部分。因此,init总是第一个进程(它的进程号总是1)。

2)僵尸进程
  • 僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。

  • 一个进程结束了,但是他的父进程没有等待(调用wait/waitpid)他, 那么他将变成一个僵尸进程

如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程, 因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程, 看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init 来接管他,成为他的父进程

3)如何区分孤儿进程和僵尸进程?
  • 孤儿进程和僵尸进程都是指的子进程

  • 由于父子进程被调度的顺序不同,进程先执行完,子进程叫孤儿进程;父进程后执行完,子进程叫僵尸进程(不一定)

4)如何避免产生僵尸进程?

父进程后执行完,子进程并不一定会变成僵尸进程,父进程执行完后只要调用wait/waitpid,释放子进程资源,子进程就不会变成僵尸进程

二、进程或线程的退出方式 1)进程退出方式

杀死进程:kill(),int kill(pid_t pid, int sig);

正常退出:

  1. main函数中return
  2. exit(),void exit(int status);
  3. _exit(),void _exit(int status);

异常退出:

  1. 调用abort(),void abort(void);
  2. 由信号终止
2)线程退出方式

杀死线程:pthread_cancel(),int pthread_cancel(pthread_t thread);

正常退出:pthread_exit(),void pthread_exit(void *retval);

三、命令查看(含main函数的进程或线程)

含main函数的进程或线程又叫主进程或主线程。

例如,查看temperature_pub进程是否已经退出ps -aux | grep temperature_pub

四、代码中判断(不含main函数的进程或线程) 1)判断进程是否退出
  • 根据wait或waitpid函数的返回值就可以判断进程是否退出
//wait和waitpid都属于系统调用


pid_t wait(int *wstatus);


int pthread_kill(pthread_t thread, int sig);
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/997626.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号