嵌入式 探讨父子线程、进程终止顺序不同产生的结果

原创 2013年12月02日 14:52:42
Linux下编程,线程、进程退出顺序问题纷纷扰扰,如果父进程/线程先于子进程/线程终止,系统会做什么处理呢?反之,如果子进程/线程先于父进程/线 程终止,系统又会做什么处理呢?下面是我个人平时在笔记上做的一些象征性的总结,如果有疑问之处,大可提出,我一直认为怀疑是人类进步的根本所在。


一、线程

    Linux线程创建函数为pthread_create(),默认规则是谁创建子线程,谁就要负责子线程的资源回收,当父线程退出后,子线程也随着退出。所以,一般情况下,父线程退出时都要确保子线程已经退出,所以会使用pthread_join()函数阻塞等待子线程的退出信号/标识。

     pthread_detach(threadid)函数的功能是使线程ID为threadid的线程处于分离状态(可以为非父子关系),一旦线程处于分离 状态,该线程终止时底层资源立即被回收;否则终止子线程的状态会一直保存占用系统的资源直到主线程调用 pthread_join(threadid,NULL)获取线程的退出状态。被创建的子线程也可以自己分离自己,子线程调用 pthread_detach(pthread_self())就是分离自己,因为pthread_self()这个函数返回的就是自己本身的线程ID。

1)父线程先于子线程终止

     父线程先于子线程,则子线程为异常退出 ,那肯定没有使用阻塞非分离函数pthread_join,分2种情况:

      a)子线程已与父线程分离,如调用线程分离函数pthread_detach,则资源被自动回收释放。

      b)子线程未与父线程分离,则资源无法释放,造成了资源浪费和系统臃肿(这种情况,我看有些资料上说系统也能自动释放子线程的资源,如关闭描述符,释放内 存空间等等,但个人做过一些测试,比如在子线程中分配很多空间等,进程退出后,top查看内存状态时还存在)。

2)子线程先于父线程终止

     也分2种情况:

        a)正常情况:子线程调用了线程分离函数ptread_detach(),或父线程调用了等待线程结束函数pthread_join()。

        b)异常情况:如果上面二者都为调用,则为子线程分配的资源无法得到释放。

 

二、进程

一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。

1)父进程先于子进程终止

     当父进程先退出时,系统会让init进程接管子进程,该子线程成为了孤儿进程

2)子进程先于父进程终止

    分为2种情况:

       a)正常情况:父进程调用了wait函数 (非父子进程则用waitpid函数),此时父进程会等待子进程结束。

       b)父进程又没有调用wait函数 (非父子进程则未调用waitpid函数),此种情况子进程进入僵死状态即僵尸进程并且会一直保持下去直到系统重启。子进程处于僵死状态时,内核只保存进程的一些必要信息以备父进程所需。此时子进程始终占有着资源,同时也减少了系统可以创建的最大进程数。

    僵死状态:一个已经终止、但是其父进程尚未对其进行善后处理(获取终止子进程的有关信息,释放它仍占有的资源)的进程被称为僵死进程(zombie)。ps命令将僵死进程的状态打印为Z 。

探讨父子线程、进程终止顺序不同产生的结果

Linux下编程,线程、进程退出顺序问题纷纷扰扰,如果父进程/线程先于子进程/线程终止,系统会做什么处理呢?反之,如果子进程/线程先于父进程/线程终止,系统又会做什么处理呢?下面是我个人平时在笔记上做...
  • huangminqiang201209
  • huangminqiang201209
  • 2013年05月06日 09:03
  • 4073

深入分析父子线程、进程终止顺序不同产生的结果

本篇文章是对父子线程、进程终止顺序不同产生的结果进行了详细的分析介绍,需要的朋友参考下 Linux下编程,线程、进程退出顺序问题纷纷扰扰,如果父进程/线程先于子进程/线程终止,系统会...
  • sinat_14840443
  • sinat_14840443
  • 2014年10月27日 15:11
  • 335

深入分析父子线程、进程终止顺序不同产生的结果

讲到分离线程,先得从僵尸进程讲起(抱歉,确实不知道线程是否有僵尸一说)。关于僵尸进程:一般情况下进程终止的时候,和它相关的系统资源也并不是主动释放的,而是进入一种通常称为“僵尸”(zombie)的状态...
  • u011170660
  • u011170660
  • 2014年08月12日 11:40
  • 337

看看进程、线程的父子关系

主线程调用pthread_join来等待子线程的结束,然后去ch
  • luckyjoy521
  • luckyjoy521
  • 2014年09月16日 18:52
  • 2076

linux多线程【8】mmap实现父子进程的共享内存通信,用信号量同步

1.创建文件。open,ftruncate 2.将文件映射到内存。内存首地址存放一个sem_t实现进程的互斥。mmap,sem_init 3.创建子进程。父子进程互斥地访问共享内存的内容。fork...
  • fall221
  • fall221
  • 2013年05月12日 17:31
  • 1624

时间片轮转调度算法的提及和关于fork函数执行父,子进程先后顺序的理解

时间片轮转调度算法的提及和关于fork函数执行父,子进程先后顺序的理解     fork函数是用来创建进程的,命令行下输入man2 fork 看到他的函数声明: #include  pid_t ...
  • lyh__521
  • lyh__521
  • 2014年07月29日 19:12
  • 1768

java线程终止探讨

程序是很简易的。然而,在编程人员面前,多线程呈现出了一组新的难题,如果没有被恰当的解决,将导致意外的行为以及细微的、难以发现的错误。       在本篇文章中,我们针对这些难题之一:如何中断一个正在...
  • w1857518575
  • w1857518575
  • 2013年10月29日 09:33
  • 420

父子进程的各种区别与联系

(一)程序中fork与I/O函数之间的关系:         write是不带缓冲 的,因为在fork之前调⽤用write,所以其数据只写到标准输出⼀一次。标准I/O是缓冲的,如果标准输出到终端设备,...
  • renchunlin66
  • renchunlin66
  • 2016年07月17日 13:01
  • 2074

嵌入式 解决线程使用sleep或usleep等函数导致整个进程睡眠的问题

解决线程使用sleep或usleep等函数导致整个进程睡眠的问题: 使用下面的函数接口完成替换线程中sleep计时 /* author : kj time : 2013-12-06 21:42 ...
  • skdkjxy
  • skdkjxy
  • 2013年12月06日 21:43
  • 1425

Linux_父子进程与fork

进程标识 每个进程都有一个非负整数表示的唯一进程ID,如交换进程(即调度进程)ID为0,init进程ID为1,页守护进程ID为2; 函数fork 原型如下: fork函数被调用一次,但返回两次,两...
  • u010275850
  • u010275850
  • 2015年11月08日 16:59
  • 1676
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:嵌入式 探讨父子线程、进程终止顺序不同产生的结果
举报原因:
原因补充:

(最多只允许输入30个字)