网站建设汕头,联盟文明网站建设有新,wordpress显示id,网站建设的客户需求调查与分析守护进程、僵尸进程、孤儿进程
守护进程#xff08;Daemon Process#xff09;
定义
守护进程又称Daemon进程#xff08;精灵进程#xff09;#xff0c;是Linux中的后台服务进程。 它的生命周期较长#xff0c;通常独立于控制终端并且周期性地执行某种任务或者等待处…守护进程、僵尸进程、孤儿进程
守护进程Daemon Process
定义
守护进程又称Daemon进程精灵进程是Linux中的后台服务进程。 它的生命周期较长通常独立于控制终端并且周期性地执行某种任务或者等待处理某些发生的事件。
守护进程是一个特殊的孤儿进程它是脱离终端的。 为什么要脱离终端呢 脱离于终端是为了避免进程被任何终端所产生的信息所打断其在执行过程中的信息也不在任何终端上显示。
查看守护进程使用ps axj
a 表示不仅列当前用户的进程也列出所有其他用户的进程x 表示不仅列有控制终端的进程也列出所有无控制终端的进程j 表示列出与作业控制相关的信息
创建守护进程
1让程序在后台执行。方法是调用fork产生一个子进程然后使父进程退出。
2调用setsid创建一个新对话期。控制终端、登录会话和进程组通常是从父进程继承下来的守护进程要摆脱它们不受它们的影响方法是调用setsid使进程成为一个会话组长。setsid调用成功后进程成为新的会话组长和进程组长并与原来的登录会话、进程组和控制终端脱离。
3禁止进程重新打开控制终端。经过以上步骤进程已经成为一个无终端的会话组长但是它可以重新申请打开一个终端。为了避免这种情况发生可以通过使进程不再是会话组长来实现。再一次通过fork创建新的子进程使调用fork的进程退出。
4关闭不再需要的文件描述符。子进程从父进程继承打开的文件描述符。如不关闭将会浪费系统资源造成进程所在的文件系统无法卸下以及引起无法预料的错误。首先获得最高文件描述符值然后用一个循环程序关闭0到最高文件描述符值的所有文件描述符。
5将当前目录更改为根目录。
6子进程从父进程继承的文件创建屏蔽字可能会拒绝某些许可权。为防止这一点使用unmask0将屏蔽字清零。
7处理SIGCHLD信号。对于服务器进程在请求到来时往往生成子进程处理请求。如果子进程等待父进程捕获状态则子进程将成为僵尸进程zombie从而占用系统资源。如果父进程等待子进程结束将增加父进程的负担影响服务器进程的并发性能。在Linux下可以简单地将SIGCHLD信号的操作设为SIG_IGN。这样子进程结束时不会产生僵尸进程。
僵尸进程Zombie Process
定义
子进程先于父进程退出且父进程没有调用wait/waitpid回收子进程的资源此时子进程就成为了僵尸进程。
僵尸进程的危害
僵尸进程会长时间占用系统资源严重时会耗尽系统的进程表资源导致系统奔溃。如果僵尸进程过多会导致系统负载过高降低系统的性能和响应速度。
如何避免僵尸进程 父进程 通过wait()/waitpid() 等函数获取子进程的退出状态从而将其彻底清除 父进程在fork()出子进程后通过设置信号处理函数SIGCHLD捕获到子进程的退出事件再通过wait()/waitpid()等函数获取其退出状态从而消除僵尸进程 子进程可以在声明自己时调用signal(SIGCHLD, SIG_IGN)函数使得该进程在退出时自动被父进程回收而不会变成僵尸进程。 使用进程间通信机制如管道pipe、消息队列message queue、共享内存、套接字socket等在子进程退出后通过通信机制向父进程发送一个通知父进程再通过wait()/waitpid()等函数获取退出状态。
孤儿进程(Orphan Process)
父进程运行结束但子进程还在运行未运行结束的子进程就称为孤儿进程Orphan Process。
孤儿进程最终会被 init 进程进程号为 1 所收养并由 init 进程对它们完成回收和释放资源。 每当出现一个孤儿进程的时候内核就把孤儿进程的父进程设置为 init 而 init 进程会循环地 wait() 它的已经退出的子进程。