系统编程-进程-守护进程、孤儿进程、僵尸进程

 

1. 守护进程

 

 

2. 孤儿进程

父进程结束,子进程就成为了孤儿进程。孤儿进程由1号进程(init进程)领养。

 

2.1实验: 

实验思路: 先产生一个孤儿进程,然后打印出该孤儿进程的父进程ID。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h> // exit(0)

int main(){

	int i=0;

	printf("before fork : pid: %d,  ppid: %d\n",  \
		                 getpid(), getppid());	
		
	pid_t pid = fork();			
	if(pid < 0){
		perror("fork ");

	}else if(0 == pid){
		sleep(3);

	}else{
		exit(0);
        }

	printf("pid: %d,  ppid: %d\n",  \
                         getpid(), getppid());	

	while(1);
	printf("pid: %d \n",  getpid());

	return 0;
}

  

2.1.1. ubuntu上编译运行

孤儿进程的父进程是init进程,即ID号为1的进程啊, 这里怎么是1673(upstart)进程? 百度下

经过百度,可以理解为: 在ubuntu内,upstart进程就是init进程。

 

2.1.2 嵌入式linux板子上运行:

 

小结: 孤儿进程的父进程是init进程, init进程的进程ID一般是1。 ubuntu上的init进程是sbin/upatsrt, 其进程ID不是1。

 

 

3. 僵尸进程及其避免方法

 

3.1 实验:

实验思路: 先产生一个僵尸进程, 然后在另一个终端内执行: ps -aux | grep process_name ,  观察该进程是否为僵尸进程。

                   同时测试杀死僵尸进程的方法。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h> // exit(0)

int main(){

	int i=0;

	printf("before fork : pid: %d,  ppid: %d\n",  \
		                 getpid(), getppid());	
		
	pid_t pid = fork();			
	if(pid < 0){
		perror("fork ");

	}else if(0 == pid){
		printf("pid: %d,  ppid: %d\n",  \
                         getpid(), getppid());	
        	exit(0);
	}

	while(1);

	return 0;
}

在一个ubuntu的终端内编译运行:

在另一个ubuntu终端内查看、验证该进程的僵尸状态

可见 12132进程是R,即运行态。 而12133是Z,即僵尸态。

 

接着,我们来测试杀死该僵尸进程的方法

测试1

 

小结: 使用kill -9 直接去杀僵尸进程 , 无法杀死。

 

测试2

此时已不存在ab内含有僵尸进程的信息。 所以僵尸进程已经被杀死。Ps: 这个12225 --color=auto不知道是啥信息,ubuntu上有这类信息了,不管他了,这不重要。

 

小结:杀死僵尸进程的父进程,可以达到杀死僵尸进程的目的。

 

 

 

.

posted @ 2021-03-04 08:52  一匹夫  阅读(191)  评论(0编辑  收藏  举报