linux 退出java,Linux的进程操作(退出进程和销毁进程)

当一个进程执行结束后必须要退出,退出时内核会进行一系列的相应操作。在Linux中,共有8种进程的退出方法,其中包括5种正常的方法和3种异常的方法。

通常来说Linux的应用代码会调用exit系列函数来退出一个进程,对其标准调用格式说明如下:#include#includevoidexit(intstatus);void_exit(intstatus);void_Exit(intstatus);

exit系列函数没有返回值,其使用一个称为终止状态的整型变量作为参数,Linux内核会对这个终止状态进行检查:当异常终止时,Linux内核会直接产生一个终止状态字,描述异常终止的原因,可以通过wait或者waitpid函数来获得终止状态字;父进程也可以通过检查终止状态来获得子进程的状态。

如果是以下三种状态:在调用exit系列函数的时候不带终止状态。main函数执行了一个无返回值的return。main函数的返回值不是一个整型。

则Linux会认为该进程的终止状态是未定义的,如果main函数的返回值定义为整型并且main函数是执行到最后一条语句返回,则该进程的终止状态是0。

在main函数中调用return语句返回,绝大多数等效于调用exit系列函数。

这两个函数的调用过程如图_exit函数:直接使进程停止运行,清除其使用的内存空间,清除其在内核中的各种数据结构。exit函数:在_exit函数的基础上做了一些包装,在执行退出之前加了若干道工序。

这两个函数的最大区别在于:前者在调用之前要检查文件的打开情况,把文件缓冲区中的内容写回文件;后者直接使进程停止运行,清除其使用的内存空间,销毁其在内核中的各种数据结构,即图中的“清理I/O缓冲”一项。销毁进程

当一个进程使用exit系列函数退出时,其会在内存中保留部分数据以供父进程查询,同时也会产生一个终止状态字,然后Linux内核会发出一个SIGCHLD信号以通知父进程,因为子进程的结束对于父进程是异步的,因而这个SIGCHLD信号对于父进程也是异步的,父进程可以不响应。

父进程对于退出之后的子进程的默认状态是不处理的,但是这样会导致系统中的僵尸进程浪费了系统资源,此时应该调用wait函数或waitpid函数对这些僵尸进程进行处理。

在调用wait或者waitpid函数之后可能存在如下三种情况:如果该父进程的所有子进程都还在运行,则阻塞父进程自身以等待子进程的运行结束。.如果有一个子进程已经结束,则父进程取得该子进程的终止状态,并且立即返回。如果该父进程没有任何子进程,则立即出错返回。

对wait和waitpid函数的标准调用格式说明如下:#include#includepid_wait(int*status);pid_twaitpid(pid_tpid,int*status,intoptions);1.wait函数如果wait函数调用成功则返回子进程的标识符,如果失败则返回-1。其中参数status是一个整型指针,可以用于存放子进程的终止状态,也可以定义为一个空指针。wait函数和waitpid函数不同,在有一个子进程终止之前,wait函数让父进程阻塞以等待子进程退出,而waitpid有一个参数可以让父进程不阻塞,并且在一个父进程有多个子进程的情况下,如果其中有一个子进程退出则会返回该子进程的进程标识符。

wait函数返回的终止状态的宏宏说明WIFEXITED(status)当子进程正常结束时返回为真WIFSIGNALED(status)当子进程异常结束时返回为真WEXITSTATUS(status)当WIFEXITED(status)为真时调用,返回状态字的低8位WTERMSIG(status)当WIFSIGNALED(status)为真时调用,返回引起终止的信号代号2.waitpid函数

在使用wait函数的时候,如果父进程的任何一个子进程返回则wait函数返回,而waitpid函数可以通过参数来指定需要等待的子进程。

waitpid函数的参数pid用于对子进程进行相应的筛选。pid>0:只等待进程ID为pid的子进程,不管其他已经有多少子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就一直等待下去。pid=-1:等待任何一个子进程退出,没有任何限制,此时waitpid等价于wait。pid=0:等待同一个进程组中的任何子进程,如果某一子进程已经加入了其他进程组,则waitpid不会对它做任何理睬。pid

waitpid函数的参数options用于进一步控制waitpid函数的操作,其可以是0,也可以是WNOHANG和WUNTRACED两个选项之一,或者是使用“I”符号连接的“或”操作。WNOHANG:如果由pid指定的子进程并不是立即可用的,则waitpid函函数不阻塞,此时返回“0”。WUNTRACED:如果其实现支持作业控制,而由pid指定的任意子进程已经处于暂停状态,并且未报告过,则返回其状态。

对于waitpid函数而言,如果指定的进程或者进程组不存在,或者参数pid指定的进程不是父进程所调用的子进程,都将出错。

总体而言,waitid函数提供了wait函数所没有的如下三个功能:能够等待指定的一个进程结束。能够不阻塞父进程获得子进程的状态。支持作业控制。

使用waitpid函数退出进程#include#include#include#include#include#includeintmain(){pid_tpid;if((pid=fork())<0)//创建子进程失败{perror("创建子进程失败!\n");exit(0);}elseif(pid==0)//进入子进程{if((pid=fork())<0){perror("创建子进程失败!\n");exit(0);}elseif(pid>0){exit(0);}else{sleep(2);printf("这是第二个子进程,parentpid=%d\n",getppid());exit(0);}}if(waitpid(pid,NULL,0)!=pid){perror("waitpid销毁进程失败!\n");exit(0);}exit(0);}

编译运行,可以看到在退出了第2个子进程后会停止运行一直等待,此时可以使用ctrl+c退出。[cassie@localhost练习]$gccwaitpid.c-owaitpid[cassie@localhost练习]$./waitpid[cassie@localhost练习]$这是第二个子进程,parentpid=1^C

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值