Linux中进程的退出

文章目录

  • 目录

    系列文章目录

    • 文章目录

      一、进程的退出方式

      1、正常退出

      2、异常退出

      二、父进程等待子进程退出

      1.明确创建子进程的目的

       2.子进程的退出状态

                       (1)不被收集
      •           (2)被收集 
        • 2.1代码示例
          • 总结

一、进程的退出方式

1、正常退出

1>Main函数调用 return.

2>进程调用exit(),标准C库.

3>进程调用_exit()或_Exit(),属于系统调用.

4>进程最后一个线程返回.

5>最后一个线程调用pthread_exit. 

2、异常退出

1>调用abort.

2>当进程收到某些信号时,如Ctrl+C.

3>最后一个线程对取消请求做出响应.

总结:不管进程如何终止,最后都会执行内核中的同一段代码。这段代码为相应的进程关闭所有代开的描述符,释放它所使用的存储器等。

二、父进程等待子进程退出

1.明确创建子进程的目的

Linux中进程的退出_第1张图片

 2.子进程的退出状态

 (1)不被收集

僵尸进程:一个进程使用 fork 创建子进程,如果子进程退出,而父进程并没有调用 wait 或 waitpid 获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵死进程。

孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。孤儿进程将被 init 进程(进程号为1)所收养,并由 init 进程对它们完成状态收集工作。

(2)被收集 

(1)wait,waitpid,waitid 收集子进程退出状态的API

(2)头文件

#include
#include

(3)函数原型

 pid_t wait(int *status);//*status 地址

 pid_t  waitpid(pid_t   pid,   int   *status,   int options);

 int  waitid(idtype_t  idtype,  id_t  id, siginfo_t *infop, int options);

1.非空:子进程退出的状态放在它所指向的地址中。

2.空:不关心退出状态。

3.返回值:如果成功,返回终止子进程的ID;错误,-1。

2.1代码示例

代码如下(示例):

#include 
#include
int main()
{
        pid_t pid;
        int cnt = 0;
        int status =10;
        pid = fork();

        if(pid > 0){
                wait(&status);
                printf("child quit,child status=%d\n",WEXITSTATUS(status));
                while(1){
                        printf("cnt=%d\n",cnt);
                        printf("this is father pid = %d \n",getpid());
                        sleep(1);
                }
        }else if(pid == 0){
                while(1){
                        printf("this is person pid,person pid=%d\n",getpid());
                        sleep(1);
                        cnt++;
                        if(cnt == 3){
                                exit(3);
                        }
                }
        }

        return 0;
}


总结

提示:这里对文章进行总结:

(1)如果所有子进程都还在运行,阻塞。

(2)如果一个子进程已终止,正在等待父进程获取其终止状态,则取得该子进程的终止状态立即返回。

(3)如果没有任何子进程,则立即出错返回。

你可能感兴趣的:(linux)