Linux操作系统——fork()的使用

fork():

  • fork() 函数用于创建一个新进程,称为子进程,它与进程(称为系统调用fork的进程)同时运行,此进程称为父进程。创建新的子进程后,两个进程将执行fork() 系统调用之后的下一条指令。

  • 图解:
    Linux操作系统——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

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