一。进程创建:
主要用fork()函数创建进程,当调用fork时,内核会做:
(1)分配新的内存块和内核数据结构给子进程。
(2)将父进程部分数据内容拷贝至子进程。
(3)添加子进程到系统进程列表当中。
(4)fork返回,开始调度器调度。
举例:
#include<stdio.h>
2 #include<unistd.h>
3 #include<stdlib.h>
4 #include<sys/types.h>
5
6 int main(void)
7 {
8 pid_t pid;
9 printf("before: pid is %d\n",getpid());
10 if( (pid=fork())==-1)perror("fork()"),exit(1);
11 printf("after:pid is %d,fork return %d\n",getpid(),pid);
12 sleep(10);
13 }
所以,fork之前父进程独立执行,fork之后,父子两个执行流分别执行。
fork的返回值:子进程返回0,父进程返回的是子进程的id。
fork调用失败的原因:(1)系统中有太多的进程。(2)实际用户的进程数超越了限制。
Linux中还有一个vfork函数:
(1)它用于创建一个子进程,而子进程与父进程共享地址空间,fork的子进程具有独立地址空间。
(2)vfork保证子进程先运行,在它调用exec之后父进程才可能被调用。
注:fork不能通过更改子进程中的变量值来改变父进程中的变量值,而vfork可以,因为它的子进程在父进程的地址空间运行。
举例:
#include<stdio.h>
2 #include<stdlib.h>
3 #include<unistd.h>
4
5 int flag=10;
6 int main(void)
7 {
8 pid_t pid;
9 if((pid=vfork())==-1)perror("fork()"),exit(1);
10 if(pid==0)
11 {
12 sleep(3);
13 flag=1;
14 printf("child flag is %d\n",flag);
15 exit(0);
16 }
17 else{
18 printf("parent flag=%d\n",flag);
19 }
20 }
这是vfork函数应用,结果是: