目录
孤儿进程
孤儿进程是操作系统中的一个概念,主要出现在类UNIX操作系统中。以下是关于孤儿进程的详细解释:
定义
孤儿进程指的是在其父进程执行完成或被终止后,仍继续运行的一类进程。这些进程由于失去了父进程的监控和管理,因此被称为“孤儿”。
产生原因
在类UNIX操作系统中,子进程是通过父进程创建的。当一个父进程由于正常完成工作而退出或由于其他情况(如异常终止)被终止时,如果它的一个或多个子进程还在运行,那么这些子进程就会成为孤儿进程。
处理机制
为避免孤儿进程退出时无法释放所占用的资源而僵死,系统会将这些孤儿进程交由init进程(进程号为1)来收养。init进程是系统启动时创建的第一个进程,负责系统的初始化和启动其他系统进程。当init进程收养了一个孤儿进程后,它会成为该孤儿进程的父进程,并负责对该孤儿进程进行状态收集和资源释放等工作。
特性与影响
- 无父进程:孤儿进程没有父进程,其父进程ID(PPID)会被设置为init进程的PID,通常为1。
- 资源释放:由于init进程会负责孤儿进程的资源释放工作,因此孤儿进程本身并不会对系统造成资源泄露等危害。
- 系统稳定性:孤儿进程的存在是系统正常运作的一部分,它们通过init进程的收养和管理,保证了系统的稳定性和资源的有效利用。
示例
以下是一个简单的示例程序,用于演示孤儿进程的产生和处理:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
pid_t fpid;
fpid = fork();
if (fpid == -1) {
printf("fork error.\n");
exit(1);
} else if (fpid == 0) { // 子进程
printf("I'm child process, child pid = %d, parent pid = %d\n", getpid(), getppid());
sleep(5); // 睡眠5秒,保证父进程退出
printf("I'm sleep. child pid = %d, parent pid = %d\n", getpid(), getppid());
printf("child process is done.\n");
} else { // 父进程
printf("I'm parent process.\n");
sleep(1); // 睡眠1秒,然后退出
printf("parent process is done. Exiting...\n");
exit(0); // 父进程退出,子进程成为孤儿进程
}
return 0;
}
在这个示例中,父进程创建了一个子进程后,自己先退出。此时,子进程成为孤儿进程,并被init进程收养。通过打印子进程的父进程ID(PPID),可以看到它变成了init进程的PID(通常为1)。
综上所述,孤儿进程是操作系统中一种正常的现象,它们通过init进程的收养和管理,保证了系统的稳定性和资源的有效利用。
守护进程(daemon)
定义:
- 守护进程(Daemon)是一类在后台运行的特殊进程,用于执行特定的系统任务。它们通常与终端无关,并且在系统启动时自动运行,直到系统关闭。
特点:
- 守护进程是脱离控制终端的,在后台运行,不受用户登录和注销的影响。
- 它们通常执行一些系统级的任务,如日志记录、网络服务等。
- 守护进程可以由系统管理员根据需要启动或停止。
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <errno.h>
#include <unistd.h>
int main(){
pid_t pid;
pid = fork();
if(pid < 0){
perror("fork");
return 0;
}
if(pid > 0){
exit(0);
}
pid = setsid();
chdir("/tmp");//改变目录
umask(0); //它的意思就是0取反再创建文件时权限相与.这样就是给后面的代码调用函数mkdir给出最大的权限,避免了创建目录或文件的权限不确定性。
int i;
FILE *fd;
time_t t;
for(i = 0;i < 3;i++){ //我们一般把守护进程的标准输入、标准输出重定向到空设备(黑洞)或者关闭,从而确保守护进程不从键盘接收任何东西,也不把输出结果打印到屏幕。
close(i);
}
int fd = open("log.txt",O_WRONLY|O_CREAT,0644);
time_t t;
while(1){
t = time(NULL);
dprintf(fd,"%s\n",ctime(&t));
fsync(fd);
sleep(3);
}
}
与孤儿进程的区别:
- 产生方式:守护进程是特意创建的,用于执行特定的系统任务;而孤儿进程是由于父进程退出而意外产生的。
- 目的与功能:守护进程的主要目的是在系统后台执行长期运行的任务;而孤儿进程本身并没有特定的目的或功能,它们只是由于父进程的退出而失去了管理。
- 处理方式:守护进程通常有自己的管理方式和退出机制;而孤儿进程则依赖于init进程进行管理和资源释放。
综上所述,孤儿进程与守护进程在操作系统中扮演着不同的角色,它们之间的主要区别在于产生方式、目的与功能以及处理方式等方面。
标签:第十二,pid,孤儿,init,Linux,进程,include,守护 From: https://blog.csdn.net/abclui/article/details/141884359