exit和wait一起可以彻底清除子进程的资源

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<stdlib.h>
#include <errno.h>
int main()
{
  pid_t p1,p2,pr;
  int i;
  for(i=0;i<=2;i++)
  {
  if((p1=fork())==0)
  {
  printf("parent process%d child  process%d\n",getppid(),getpid());
  exit(0);
  }
  else{
  pr=wait(NULL);
//如果成功,wait会返回被收集的子进程的进程ID,
//如果调用进程没有子进程,调用就 会失败,此时wait返回-1,同时errno被置为ECHILD。
  if( pr>0)
   printf("I catched a child process with pid of %d\n", pr);
  else
   printf("error: %s\n.\n", strerror(errno));
  }
 }
 return 0;
}
输出结果如下:
parent process4595 child  process4596
I catched a child process with pid of 4596
parent process4595 child  process4597
I catched a child process with pid of 4597
parent process4595 child  process4598
I catched a child process with pid of 4598
当把exit注释后输出结果如下:
parent process4642 child  process4643
parent process4643 child  process4644
parent process4644 child  process4645
I catched a child process with pid of 4645
I catched a child process with pid of 4644
parent process4643 child  process4646
I catched a child process with pid of 4646
I catched a child process with pid of 4643
parent process4642 child  process4647
parent process4647 child  process4648
I catched a child process with pid of 4648
I catched a child process with pid of 4647
parent process4642 child  process4649
I catched a child process with pid of 4649
//重新执行一边的结果
parent process4657 child  process4658
parent process4658 child  process4659
parent process4659 child  process4660
I catched a child process with pid of 4660
I catched a child process with pid of 4659
parent process4658 child  process4661
I catched a child process with pid of 4661
I catched a child process with pid of 4658
parent process4657 child  process4662
parent process4662 child  process4663
I catched a child process with pid of 4663
I catched a child process with pid of 4662
parent process4657 child  process4664
I catched a child process with pid of 4664
从上面的输出结果可以得出:exit可以用来释放进程的资源,必须加上,当注释掉时,可能因为子进程的资源没有
及时清理掉,所以导致wait阻塞住,不能及时清理掉子进程!
总结:当进程发出exit该调用时,内核会释放进程占有的资源,释放进程上下文所占的内存空间,保留
进程表项,将进程表项中记录进程状态的关键字设为僵死状态。内核在进程收到不可扑捉的信号时,会从内核内部调用exit
,使得进程退出。父进程通过wait,并释放进程表项。
 
时间: 2024-10-04 09:52:19

exit和wait一起可以彻底清除子进程的资源的相关文章

清除nginx静态资源缓存

之前写过一篇如何配置nginx缓存及手动清除缓存的文章: http://www.cnblogs.com/Eivll0m/p/4921829.html 但如果有大量缓存需要清理,手动一条条清理就比较慢了,所以写了个小脚本进行清理,脚本如下: #!/usr/bin/env python # -*- coding: UTF-8 -*- # data:2015-12-08 # author:eivll0m # 脚本用途:清除nginx静态资源缓存 # 使用方法:将要清楚缓存的url粘贴到/app/adm

进程操作篇atexit execl exit fprintf fscanf getpid nice get priority printf setpid system vfork wait waitpid

atexit(设置程序正常结束前调用的函数) 相关函数 _exit,exit,on_exit 表头文件 #include<stdlib.h> 定义函数 int atexit (void (*function)(void)); 函数说明 atexit()用来设置一个程序正常结束前调用的函数.当程序通过调用exit()或从main中返回时,参数function所指定的函数会先被调用,然后才真正由exit()结束程序. 返回值 如果执行成功则返回0,否则返回-1,失败原因存于errno中. 范例 #

os.waitpid()无法获取sys.exit()退出时的status code

[目的] 父进程使用os.waitpid()等待子进程退出,并检测子进程的exit code,以决定是否重启子进程. (常见的应用场景是:子进程接收外部命令,收到"stop"时退出所有进程,终止服务:收到"restart"时所有子进程退出,父进程重启所有子进程,以达到重启服务的目的). 这里面的关键点在于,子进程退出时设置exit code,父进程waitpid时获取该exit code,进而决定是否需要重启子进程. [问题] 子进程 ...#need restar

进程退出exit、_exit、abort

分为正常退出,异常退出 正常退出的方法: 1.在main函数中执行return 2.调用exit函数 3.调用_exit  函数 ------------------------------------------------------------------ 异常退出的方法: 1.调用abort函数 2.进程收到某个信号,而该信号使进程终止 ------------------------------------------------------------------ 不管是哪种退出方式

父进程和子进程

父进程 在计算机领域,父进程(英语:Parent Process)指已创建一个或多个子进程的进程. UNIX 在UNIX里,除了进程0(即PID=0的交换进程,Swapper Process)以外的所有进程都是由其他进程使用系统调用fork创建的,这里调用fork创建新进程的进程即为父进程,而相对应的为其创建出的进程则为子进程,因而除了进程0以外的进程都只有一个父进程,但一个进程可以有多个子进程. 操作系统内核以进程标识符(Process Identifier,即PID)来识别进程.进程0是系统

Linux C _exit函数与exit函数的联系与区别

一.联系 1.功能上,_exit和exit函数都是让进程正常退出,即关闭进程所打开的文件描述符,释放已占用内存和其他资源. 二.区别 1._exit函数在头文件unistd.h中声明,而exit在头文件stdlib.h中声明. 2.执行_exit函数后,控制权立即返回给内核,而exit函数要先执行一些清除操作,然后才将控制权交给内核. 3._exit函数不会刷新I/O缓冲区,可能造成数据丢失,而exit函数是在_exit函数之上的一个封装,它在调用_exit函数之前,会先刷新I/O缓冲区,保证了

回收进程用户空间资源 exit()函数 _exit()函数 atexit()函数 on_exit()函数

摘要:本文主要讲述进程的终止方式,以及如何使用exit()函数来终止进程,回收进程用户空间资源:分析了exit()函数与_exit()函数,return关键字的差异.同时详细解读了如何使用atexit()和on_exit()函数来注册终止处理程序. 进程终止.回收资源 1.进程终止方式 在内核中,程序执行的唯一方法是调用一个exec函数.而进程自愿终止的唯一方法是显示或隐式地调用_exit()或_Exit(). 进程有5种正常终止方式: (1)常见的一种是,在main函数中执行return语句,

UNIX网络编程卷1 服务器程序设计范式5 预先派生子进程,由父进程向子进程传递套接字描述符

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.只让你进程调用 accept,然后把所接受的已连接套接字"传递"给某个子进程. 这样做就不用因为所有子进程都调用 accept 而需提供上锁保护 2.父进程必须跟踪子进程的忙闲状态,以便给空闲子进程传递新的套接字 typedef struct { pid_t child_pid; /* 子进程的进程 ID */ int child_pipefd; /* 父进程中连接到该子进程

第34篇 通过类的方法开启子进程,以及传参,join阻塞,daemon守护进程,同步Lock,Samphore信号量,event事件

内容大纲: Process开启子进程 #另外一种开启子进程的方式 #join控制子进程 #守护进程 同步控制 #锁 Lock #信号量 Samphore #事件 Event #join控制子进程#p.join() 阻塞p进程,p进程执行结束,才结束阻塞.import timeimport randomfrom multiprocessing import Processdef func(index): time.sleep(random.random()) print('第%s个邮件已经发送完毕