当前位置: 技术问答>linux和unix
求助:Linux下fork()子进程问题
来源: 互联网 发布时间:2016-06-11
本文导语: 各位大侠: 我编了一个Linux下的程序,在程序中需要根据情况用fork()函数起一些子进程来进行相应的处理,子进程执行完毕后,希望能够完全释放资源,除了调用exit()退出子进程外,是不是还需要做一些别的善后...
各位大侠:
我编了一个Linux下的程序,在程序中需要根据情况用fork()函数起一些子进程来进行相应的处理,子进程执行完毕后,希望能够完全释放资源,除了调用exit()退出子进程外,是不是还需要做一些别的善后工作,才能完全释放资源,希望得到各位大侠的帮助,多谢了。
我编了一个Linux下的程序,在程序中需要根据情况用fork()函数起一些子进程来进行相应的处理,子进程执行完毕后,希望能够完全释放资源,除了调用exit()退出子进程外,是不是还需要做一些别的善后工作,才能完全释放资源,希望得到各位大侠的帮助,多谢了。
|
主进程需要调用 wait() 或者类似函数,当子进程执行完毕,需要它们的父进程进行扫尾工作。这个任务,称为”收获孩子”(reaping a child),可以用wati*()函数完成。紧跟在fork()之后,父进程可以等待子进程完成并在那进行扫尾。父进程也可以继续运行,稍后再扫尾,同样也是用wait*()函数中的一个。不管父进程选择了那个方法,该工作都必须进行。当子进程完成执行,还没有被收获的时候,它进入了闲置状态,变成了著名的僵尸进程。
调用wait()会挂起执行(比如,waits),直到子进程(其他的子进程)正常执行完毕或通过信号终止。wait()将会收获子进程,释放所有的资源。如果子进程已经完成,那么wait()只是进行些收获的过程。
调用wait()会挂起执行(比如,waits),直到子进程(其他的子进程)正常执行完毕或通过信号终止。wait()将会收获子进程,释放所有的资源。如果子进程已经完成,那么wait()只是进行些收获的过程。
|
up
|
用wait或者waitpid吧,waitpid带WNOHANG参数时,可以不阻塞父进程
|
建议用waitpid吧
|
exit会完全善后该进程的东西了啊,不过如果有用到堆里的空间,最好绑定一个atexit的函数来释放堆空间。
当然,父进程还必须wait或者waitpid为子进程收尸。
用waitpid设置非阻塞吧
当然,父进程还必须wait或者waitpid为子进程收尸。
用waitpid设置非阻塞吧
|
程序一退出,所有的资源都会释放。资源泄露的问题一般是在服务程序中发生,也就是需要一直运行下去的程序,才会有明显的资源泄露问题。使用exit函数的程序将退出,所以,不管是程序员自己释放资源还是系统回收资源,资源都将归还给操作系统。
|
up一下