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
写实拷贝:写时拷贝是一种可以推迟甚至免除拷贝数据的技术。内核此时并不复制整个地址空间,而是让父进程和子进程共享一个拷贝。只有在需要写入的时候,数据才会复制,从而使各个进程拥有各自的拷贝。也就是说,资源的复制只有在需要写入的时候才进行,在此之前,只是以只读方式共享。这种技术使地址空间的页的拷贝被推迟到实际发生写入的时候。