微软官方MSDN原版Win10系统下载

现在位置: 首页  > 系统教程  > Linux教程

Linux系统调用fork()函数的方法

时间:2024-05-02 12:47:34   

大家好,今天Win10系统之家小编给大家分享「Linux系统调用fork()函数的方法」的知识,如果能碰巧解决你现在面临的问题,记得收藏本站或分享给你的好友们哟~,现在开始吧!

Linuxman - Linux 命令速查手册系列软件最新版本下载

  fork()函数是分叉函数,现有的进程可以调用fork()函数来新建一个新进程,那么在Linux下要如何调用fork()函数呢?又或者fork()函数要如何在Linux下实现呢?随小编一起来瞧瞧吧。

  1.传统的fork()系统调用直接把所有的资源复制给新创建的进程.Linux的fork()使用写时拷贝(copy-on-write)页实现。写时拷贝是一种可以推迟甚至免除拷贝数据的技术,内核此时并不复制整个进程地址空间,而是让父进程和子进程共享同一个拷贝。

  只有在需要写入的时候,数据才会被复制,从而使各个进程拥有各自的拷贝,也就是说,资源的复制只有在需要写入的时候才进行,在此之前,只是以只读的方式共享。这种技术使地址空间上的页的拷贝被推迟到实際发生写入的时候才进行。在页跟本不会被写入的情况下(比如:fork()后立即调用exec())它们就无需复制了。

  2.linux通过系统调用clone()来实现fork()。然后由clone()来调用do_fork()。

  linux下fork()函数的实现:

  Linux通过clone()系统调用实现fork()。这个调用通过一系列的参数标志来指明父,子进程需要共享的资源。fork(),vfork()和__clone()库函数都根据各自需要的参数标志去调用clone()。然后由clone()去调用do_fork()。

  do_frok完成了创建中的大部分工作,它的定义在ker/frok.c文件中。该函数调用copy_process()的函数,然后让进程开始运行。copy_process()函数完成的工作很有意思:

  1.调用dup_task_struct()为新进程创建一个内核栈,thread_info结构和task_struct,这些值与当前进程的值相同。此时,子进程和父进程的描述符是完全相同的。

  2.检查新创建的这个子进程后,当前用户所拥有的进程数目没有超出给它分配的资源的限制。

  3.现在,子进程着手使自己与父进程区别开来。进程描述符内的许多成员都要被清0或者设为初始值。进程描述符的成员值并不是继承而来的,而主要是统计信息。进程描述符中的大多数数据都是共享的。

  4.接下来,子进程的状态被设置为TASK_UNINTERRUPTIBLE以保证它不会投入运行。

  5.copy_process()调用copy_flags()以更新task_struct的flags成员。表明进程是否拥有超级用户权限的PF_SUPERPRIV的标志被清0.表明进程还没有调用exec()函数的PF_FORKNOEXEC标志被设置。

  6.调用get_pid()为新进程获取一个有效的PID。

  7.根据传递给clone()的参数标志,copy_process()拷贝或共享打开的文件,文件系统信息,信号处理函数,进程地址空间和命名空间等。再一半情况下,这些资源会被给定进程的所有线程共享;否则,这些资源对每个进程是不同的,因此被拷贝到了这里。

  8.让父进程和子进程平分剩余的时间片。

  9.最后,copy_process()做扫尾工作并返回一个指向子进程的指针。

  再回到do_fork()函数,如果copy_process()函数返回成功,新创建的子进程被唤醒并让其投入运行。内核有意选择子进程首先执行。因为一半子进程都会马上调用exec()函数,这样可以避免写时拷贝的额外开销,如果父进程首先执行的话,有可能会开始向地址空间写入。

  上面就是Linux调用fork()函数的方法介绍了,本文除了介绍了Linux下调用fork()函数的方法,还对fork()函数的实现做了详细介绍,希望对你有所帮助。

以上就是关于「Linux系统调用fork()函数的方法」的全部内容,本文讲解到这里啦,希望对大家有所帮助。如果你还想了解更多这方面的信息,记得收藏关注本站~

【②文章*来自Win10系统之家!】

相关文章

  • Linux系统调用fork()函数的方法

    Linux系统调用fork()函数的方法


      fork()函数是分叉函数,现有的进程可以调用fork()函数来新建一个新进程,那么在Linux下要如何调用fork()函数呢?又或者fork()函数要如何在Linux下实现呢?随小编一起来瞧瞧吧。
      1.传统的fork()系统调用直接把所有的资源复制给新创建的进程.Linux的fork()使用写时拷贝(copy-on-write)页实现。写时拷贝是一种可以推迟甚至免除拷贝...
  • Linux建立pipe管道函数的方法

    Linux建立pipe管道函数的方法


      pipe是Linux系统中的管道,管道机制的主体是pipe函数的调用,那么Linux系统要如何建立pipe函数呢?下面小编就给大家介绍下Linux建立pipe函数的方法,一起来了解下吧。
      ●无名管道
      主要用于父进程与子进程之间,或者两个兄弟进程之间。在linux系统中可以通过系统调用建立起一个单向的通信管道,且这种关系只能由父进程来建立。因此,每个管道都是单向...
  • 查看Linux磁盘空间的八大方法

    查看Linux磁盘空间的八大方法


      我们都知道,Windows系统可以很轻易的查看磁盘分区的空间还剩多少,而Linux系统就没那么简单了,但是还是有很多方法查看Linux磁盘空间的大小,可以借助一些工具来查看。
      一、df命令;
      df是来自于coreutils软件包,系统安装时,就自带的;我们通过这个命令可以查看磁盘的使用情况以及文件系统被挂载的位置;
      举例:
      [root@...
  • Linux下xfs扩展方法指南

    Linux下xfs扩展方法指南


      为避免造成系统额外空间的浪费,扩展XFS文件系统是很有必要的,那么在Linux下要如何扩展XFS文件系统呢?下面小编就给大家介绍下Linux扩展XFS文件系统的方法。
      Linux扩展XFS文件系统步骤:
      XFS是一个开源的(GPL)日志文件系统,最初由硅谷图形(SGI)开发,现在大多数的Linux发行版都支持。事实上,XFS已被最新的CentOS/RHEL7采...