【财经源码带采集】【java zk源码分析】【windows ndk编译源码】WIFEXITED源码

2024-11-19 00:32:21 来源:电脑源码讲解视频 分类:知识

1.入门篇:进程等待函数wait详解

WIFEXITED源码

入门篇:进程等待函数wait详解

       前言:

       编程过程中,有时需要让一个进程等待另一个进程,最常见的是父进程等待自己的子进程,或者父进程回收自己的子进程资源包括僵尸进程。这里简单介绍一下系统调用函数:wait()。

       文章福利小编推荐自己的财经源码带采集Linux内核源码交流群:整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!!!前名可进群领取,并额外赠送一份价值的内核资料包(含视频教程、电子书、实战项目及代码)!

       学习直通车: Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈

       进程等待的作用:

       进程等待的方法(如何让父进程进行进程等待):wait函数和waitpid函数

       函数原型:

       作用:进程一旦调用了wait,就会立刻阻塞自己,由wait分析当前进程中的某个子进程是否已经退出了,如果让它找到这样一个已经变成僵尸进程的子进程,wait会收集这个子进程的信息,并将它彻底销毁后返回;如果没有找到这样一个子进程,wait会一直阻塞直到有一个出现。java zk源码分析参数statloc用来保存被收集进程退出时的一些状态,它是一个指向int型的指针。但如果对这个子进程是如何死掉的不在乎,咱们可以将它设置为NULL:pid = wait(NULL);如果成功,wait会返回被收集的子进程的进程ID,如果调用进程没有子进程,调用会失败,wait返回-1,同时errno会被设置为ECHILD。

       运行后:

       在第二次打印之前有十秒钟的windows ndk编译源码等待时间,这是我们设置的让子进程睡眠的时间,只有子进程睡眠后醒来,它才能正常退出,也就是能被父进程捕捉到。不管设置多长时间,父进程都会等待下去。

       注意:

       当父进程忘了用wait()函数等待已终止的子进程时,子进程就会进入一种无父进程的状态,此时子进程就是僵尸进程. wait()要与fork()配套出现,如果在使用fork()之前调用wait(),wait()的返回值则为-1,正常情况下wait()的返回值为子进程的PID. 如果先终止父进程,子进程将继续正常进行,只是它将由init进程(PID 1)继承,当子进程终止时,init进程捕获这个状态. 参数status用来保存被收集进程退出时的一些状态,它是一个指向int类型的指针。但如果我们对这个子进程是源码进程登记管理如何死掉毫不在意,只想把这个僵尸进程消灭掉,(事实上绝大多数情况下,我们都会这样想),我们就可以设定这个参数为NULL,就像下面这样: pid = wait(NULL); 如果成功,wait会返回被收集的子进程的进程ID,如果调用进程没有子进程,调用就会失败,此时wait返回-1,同时errno被置为ECHILD。招聘移动端源码 如果参数status的值不是NULL,wait就会把子进程退出时的状态取出并存入其中, 这是一个整数值(int),指出了子进程是正常退出还是被非正常结束的,以及正常结束时的返回值,或被哪一个信号结束的等信息。由于这些信息 被存放在一个整数的不同二进制位中,所以用常规的方法读取会非常麻烦,人们就设计了一套专门的宏(macro)来完成这项工作,下面我们来学习一下其中最常用的两个: 1,WIFEXITED(status) 这个宏用来指出子进程是否为正常退出的,如果是,它会返回一个非零值。 (请注意,虽然名字一样,这里的参数status并不同于wait唯一的参数–指向整数的指针status,而是那个指针所指向的整数,切记不要搞混了。) 2, WEXITSTATUS(status) 当WIFEXITED返回非零值时,我们可以用这个宏来提取子进程的返回值,如果子进程调用exit(5)退出,WEXITSTATUS(status) 就会返回5;如果子进程调用exit(7),WEXITSTATUS(status)就会返回7。请注意,如果进程不是正常退出的,也就是说, WIFEXITED返回0,这个值就毫无意义。

       代码示例:wait.c

       运行结果:

       wait函数:pid_t wait (int* status)

       在编码时有一个代码规范:

       如果是输入型,参数定义成引用;

       如果是输出或者输入输出参数,参数定义成指针;

       wait函数的四个特性:

       1.输出型参数,与其对应的有:

       2.int* status是一个指针类型占四个字节,但是实际中只使用到后两个字节,将这两个字节分为三部分:

       退出码:程序正常退出时用到

       coredump标志位,退出信号是程序异常退出时用到:

       用退出信号判断进程是否正常退出:

       产生coredump文件不能判断进程是否正常退出的原因:

       1.判断是否有退出信号

       2.判断coredump标志位

       3.判断退出码

       使用wait函数阻止子进程变成僵尸进程

       运行情况:

       阻塞:

       阻塞概念:当调用结果返回之前,当前的执行流会被挂起,并在得到结果之后返回

       父进程一直在wait,并没有返回;

       对阻塞和非阻塞理解:

       1.子进程一种在运行;

       2.子进程已退出

       对于两种非阻塞的情况,父进程都是直接退出,但是两种情况父进程退出后,一种正常一种不正常

       waitpid函数

       wait函数的实现是调用waitpid函数实现

       我爱内核网 - 构建全国最权威的内核技术交流分享论坛

       原文地址: 进程等待函数wait详解 - 进程管理 - 我爱内核网(侵删)

       精彩推荐:

       如何理解Linux内核下的进程切换

       玩转腾讯首发Linux内核源码《嵌入式开发笔记》,也许能帮到你哦

       简要分析Linux下多进程的同步和互斥

       [实战篇]红黑树在Linux内核中的应用

       %Linux使用者都不知道的内存问题

本文地址:http://8o.net.cn/news/44d150898447.html 欢迎转发