Linux操作系统——fork()的使用
fork():
-
fork() 函数用于创建一个新进程,称为子进程,它与进程(称为系统调用fork的进程)同时运行,此进程称为父进程。创建新的子进程后,两个进程将执行fork() 系统调用之后的下一条指令。
-
图解:
-
调用fork()函数时,当控制转移到内核中的fork代码后,内核开始做:
1.分配新的内存块和内核数据结构给子进程。
2.将父进程数据结构内容写实拷贝至子进程。
3.将子进程添加到系统进程列表。
4.fork返回开始调度器,调度 -
fork()的返回值
负值:创建子进程失败。
零:返回到新创建的子进程。
正值:返回父母或来电者。该值包含新创建的子进程的进程ID -
程序中fork的返回值
1.fork的子进程返回为0;
2.父进程返回的是子进程的pid。 -
例题:
fork() || fork()
printf(“A\n”); // stdout AAA
fork() && fork()
printf(“A\n”); // stdout AAA
fork() || fork()
printf(“A”); // stdout AAAA
- 写实拷贝:写时拷贝是一种可以推迟甚至免除拷贝数据的技术。内核此时并不复制整个地址空间,而是让父进程和子进程共享一个拷贝。只有在需要写入的时候,数据才会复制,从而使各个进程拥有各自的拷贝。也就是说,资源的复制只有在需要写入的时候才进行,在此之前,只是以只读方式共享。这种技术使地址空间的页的拷贝被推迟到实际发生写入的时候。