一:进程创建
fork创建进程
在https://mp.csdn.net/postedit/81710318博客中简单介绍了用fork创建进程,
用fork创建进程时,子进程复制的是父进程的PCB,包括子进程复制了父进程的虚拟地址空间和页表,所以子进程的数据和父进程的数据虚拟地址相同,由于页表映射,这时子进程和父进程物理内存也相同,但是当子进程的数据发生改变时,系统会为子进程的数据重新分配物理内存空间,这时两者的物理内存不同,也就意味着子进程数据的改变不会影响父进程数据(写时拷贝)。
在fork之前,父进程单独执行,fork之后,父子进程分流执行。
fork常规用法:
子进程复制父进程,由于fork返回值不同分流后,父子进程可以同时执行不同的代码段。如:父进程等待客户端请求,生成子进程来处理请求;
一个进程要执行一个不同的程序。如子进程从fork返回后,可以调用exec函数。
fork调用失败的原因:
系统有太多的进程,而且规定了用户可以启动的进程数,但实际用户的进程数超过了限制,就会造成fork调用失败。
vfork创建进程:
vfork用于创建一个子进程,子进程和父进程共享一个虚拟地址空间,而fork父子进程有独立的虚拟地址空间;
vfork保证子进程先执行,当子进程调用exit或exec之后父进程才可能被调度执行。
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<stdlib.h>
4 int main()
5 {
6 int pid=-1;
7 int val=100;
8 pid=vfork();
9 printf("-----%d\n",getpid());
10 if(pid<0)
11 exit(0);
12 else if(pid==0)
13 {
14 val=200;
15 printf("this id child!! %d\n",getpid());
16 // exit(0);
17 }
18 else
19 {
20 printf("this is parent!!%d %d\n",getpid(),val);
21 }
22 while(1)
23 {
24 printf("this is public!! %d\n",getpid());
25 sleep(1);
26 }
27 }
当子进程exit退出后:父进程开始执行
子进程修改了父进程的值,因为子进程在父进程的地址空间运行。
vfork :创建一个子进程
子进程没有退出或者运行其他程序之前,父进程阻塞在vfork处不返回。
二:进程终止
正常退出:
从main函数return :
1 #include<stdio.h>
2
3 int main()
4 {
5 int i=1;
6 if(i>0)
7 return 1;
8 else
9 return -1;
10 }
可以用$?查看程序的退出码;只有在 main函数return才会退出进程,在main函数中return 跟调用exit效果一样