Linux中fork函数的作用及用法

在Linux中fork函数是非常重要的函数,它的作用是从已经存在的进程中创建一个子进程,而原进程称为父进程。

#include<unistd.h>//引用fork时的头文件
pid_t   fork(void);//fork的返回类型为空1

这里写图片描述

调用fork(),当控制转移到内核中的fork代码后,内核开始做:
1.分配新的内存块和内核数据结构给子进程。
2.将父进程部分数据结构内容拷贝至子进程。
3.将子进程添加到系统进程列表。
4.fork返回开始调度器,调度。
来段代码:

1 #include<stdio.h> 
 2 #include<unistd.h> 
 3 #include<stdlib.h> 
 4 int main() 
 5 { 
 6 pid_t pid; 
 7 printf("before :pid is %d\n",getpid()); 
 8 if((pid=fork())==-1) 
 9 perror("fork()"),exit(1); 
 10 printf("After:pid=%d,fork return %d\n",getpid(),pid); 
 11 sleep(1); 
 12 
 13 return 0; 
 14 } 
 15 

这里写图片描述
这个简单的例子有一些微妙的方面:

•调用一次,返回两次
fork函数被父进程调用一次,但是却返回两次;一次是返回到父进程,一次是返回到新创建的子进程。
这里写图片描述

•并发执行
子进程和父进程是并发运行的独立进程。内核能够以任意的方式交替执行他们的逻辑控制流中的指令。在我们的系统上运行这个程序时,父进程先运行它的printf语句,然后是子进程。

•相同但是独立的地址空间
因为父进程和子进程是独立的进程,他们都有自己私有的地址空间,当父进程或者子进程单独改变时,不会影响到彼此,类似于c++的写实拷贝的形式自建一个副本。

•fork的返回值
1.fork的子进程返回为0;
2.父进程返回的是子进程的pid。

•fork的常规用法
1.一个父进程希望复制自己,使得子进程同时执行不同的代码段,例如:父进程等待客户端请求,生成一个子进程来等待请求处理。
2.一个进程要执行一个不同的程序。

•fokr调用失败的原因
1.系统中有太多进程
2.实际用户的进程数超过限制

猜你喜欢

转载自blog.csdn.net/weixin_40853073/article/details/81873398