1. Linux
1.1 Linux内核
Linux内核代码是C语言编写的,fork复制进程先复制PCB,在复制进程实体,父子进程并发执行。 系统通过双向链表管理进程,节点数量就是进程数量,
1.2 bash命令解释器
当执行某个命令,比如./main命令,./main命令本质上是一个可执行程序,bash复制自己本身,将复制出来的子bash替换成main程序,然后运行man程序。
父进程的父进程是bash
1.3 内存空间
打印出来的是逻辑内存地址,不是真实物理内存地址,所以它们使用的不是同一块内存空间。
- Fork执行过程中,父进程内存地址空间会到复制到子进程中
2. 僵死进程(僵尸进程)
2.1 僵死进程的产生
代码示例
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<unistd.h>
4 int main(int argc,char*argv[],char*envp[])
5 {
6 int n=0;
7 char*s=NULL;
8
9 pid_t id=fork();
10
11 if(id==-1)
12 {
13 exit(1);
14 }
15
16 if(id==0)
17 {
18 n=7;
19 s="child";
20 }
21 else
22 {
23 n=3;
24 s="parent";
25 }
26 int i=0;
27 for(;i<n;i++)
28 {
29 printf("s=%s,curr_pid=%d,curr_ppid=%d,%p \n",s,getpid(),getppid(),&n);
30 sleep(1);
31 }
32 exit(0);
33 }
运行结果
2.2 僵死进程定义
当子进程先于父进程结束,父进程没有获取子进程的退出码时候,子进程就会处于僵死进程状态。
2.3 僵死进程及处理方法
- 1 僵死进程概念:子进程先于父进程结束,父进程没有调用wait获取子进程退出码。
- 2 如何处理僵死进程:父进程通过调用wait()完成。
- 3 Init进程收养孤儿进程
2.4 如何获取僵死进程退出码?
代码示例
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<unistd.h>
4 #include<sys/wait.h>
5 int main(int argc,char*argv[],char*envp[])
6 {
7 int n=0;
8 char*s=NULL;
9
10 pid_t id=fork();
11
12 if(id==-1)
13 {
14 exit(1);
15 }
16
17 if(id==0)
18 {
19 n=3;
20 s="child";
21 }
22 else
23 {
24 n=7;
25 s="parent";
26 int val=0;
27 int child_pid=wait(&val);
28 if(WIFEXITED(val))
29 {
30 printf("exit code:%d\n",WEXITSTATUS(val));
31 }
32 }
33 exit(3);
34 }
运行结果
|