fork()系统调用的理解

fork() 复制当前进程并创建一个新进程。
坦白讲,子进程是父进程的孪生兄弟,但它拥有独立的内存。

返回值很重要。
父进程获取子产品ID,子进程返回0。
如果返回-1 ,则构建失败,直接退出。

重点:子进程拥有独立的内存,但文件描述符默认是继承的。
写入时注意优化转录,避免数据污染。

执行顺序已损坏。
谁先跑,父亲还是儿子,取决于CPU的心情。
也许父亲先出来,也许儿子先出来。

使用fork时必须注意三点: 1 、子进程必须终止,不能留下僵尸进程。
2 . 谨慎使用多线程,因为fork只复制主线程。
3 . 现代系统使用写时复制功能来节省内存。

典型场景:命令执行、并行计算、服务独立。
例如,ls 命令分叉子进程来运行。

看看代码你就明白了。
弹出命令被破坏了,但是它们都是在fork之后执行的。

子进程和父进程关系

哦,说到子进程和父进程的关系,这个问题就复杂了。
首先我们来说说资源继承。
这就像一对父子分享一系列的事情。
例如,我(父进程)打开了一个日志文件来记录程序的各种信息。
非常方便的是,我的儿子(子进程)出生后,我可以直接使用这个日志文件,而不必再次打开它。
这就像我的家人买了一台电视,我的儿子可以看电视而不必购买另一台电视。

如果说起执行顺序,父子俩似乎都在忙着自己的工作。
即使在我(父进程)创建了我的儿子(子进程)之后,它仍然继续做它的工作并且没有停下来等待我的儿子。
他(子进程)想做什么就做什么,与我无关。
这样,我可以让他做他的事,我做我自己的事,从而提高工作效率。

像我一样,进程控制(父进程)可以控制我的儿子(子进程)。
我可以通过信号告诉它(子进程)做什么,比如要求它停止、继续或终止。
正如我教导儿子的那样,该休息的时候就休息,该学习的时候就学习。

最后还有生命周期关联,就像我儿子(子进程)的生命和我(父进程)的生命有关系一样。
他出生后,我发现他有一个像我一样的父亲。
当这个人完成任务时,我可以知道他是否完成了,是否有任何问题。
这样,你就可以根据他的表现来决定下一步该做什么。

嗯,说到底,父子之间是一种相互依存、相互影响的关系,各有各的责任和义务。