12.进程-进程的产生(fork函数)

上篇文章中的a.out进程实际上是由终端 bash 进程创造出来的;

那 bash 进程的父进程又是谁呢?如果你不断追溯下去,你就会发现,最终的那个进程就是 pid 为1 的 init 进程,而 init 进程,又是由一个 pid 为 0 的进程通过系统调用 fork 生成的,它也是第一个由 fork 函数创造出来的进程;

fork 是用户创建进程的唯一方法(万事都有特例,现阶段可忽略);

fork函数

在刚开始的时候,fork出来的进程和父进程一模一样;

fork函数不需要参数

这个函数神奇的地方在于,“一次调用两次返回”。这可能让你懵逼,那就举个例子让你明白。

有一天你学会了影分身术,念了一句咒语“急急如律令,分!”,一瞬间冒出了一个和你一模一样的人站在你身边。那个复制出来的你刚一出来就大喊“大家好,我是鸣人分身!”,同时你也大喊到“大家好,我是鸣人本体!”。

fork 函数就像那句咒语,而分身完成后,你和你的分身说的话,就相当于 fork 函数的返回值

fork函数的返回值

fork 函数返回值是 pid_t 类型,它就是通过 typedef 定义的一个 32 位的有符号整型数(32位 linux 系统);

不同的返回值,描述了进程的身份,到底是分身,还是本体?

  • >0: 本体(调用 fork 的那个进程),这个值,是分身(子进程)的 id 号。
  • =0: 分身(子进程)
  • =-1:失败

你始终要记住,fork 是影分身口语,是本体念出来的;

而返回值,是本体和分身都要念的;

如何判断谁是本体谁是分身,就看本体和分身念的是什么;

fork函数的返回值如果是 0 ,说明它是分身,是子进程,它不需要喊出自己的名字(对应于pid),因为子进程可以通过 getpid 函数来知道自己的名字;

如果返回值大于 0,说明它是本体,因为本体需要知道自己分身的名字;

如果返回值等于 -1,很不幸,这次分身术失败;

猜你喜欢

转载自blog.csdn.net/regemc/article/details/80862419