在Linux运维中如何用cat命令创建一个前台进程?

结论:操作正确。

终端。
当前目录。
猫 > 我的文件。
断线。
这是 myfile 的内容。
CTRL+D。
这。

验证该文件是否存在。

Linux有几个线程?

说实话,Linux进程管理的这一部分确实很有趣。
当我刚开始做服务器维护的时候,老板带我去看了《这就是如何学习Linux》一书,我说,特别是第二章,如果你能理解fork和clone,你基本上就能理解创建过程的脉络。

先说说这几个函数的位置。
fork、vfork、clone都是内核通过do_fork函数实现的,但是它们的服务场景完全不同。
现在。
分叉非常简单直接,就像人类生孩子一样——完全复制基因池(内存空间)。
我记得调试一个旧的Java进程,发现它在子进程经常被阻塞后会占用内存。
后来我发现父进程的整个内存都被子进程占用了,因为当时新程序没有被exec()ed。
这是典型的牛(copy-on-write)机制在工作。
但 COW 有一个奇怪的操作。
甚至堆栈空间也是由父进程共享的。
这让我以为堆栈溢出是调试时子进程导致的。
但我花了很长时间才找到原因。
vfork政策确实不合适。
回过头来,我看到了 Solaris 系统上遗留代码的 Vfork+exec 组合。
系统管理员然后告诉我内存比现在更贵。
直接fork和exec相当于把父进程的所有内存当成垃圾。
vfork的出现就是为了解决这个痛点。
不过后来Linux被用来优化fork。
复制页面文件的成本并没有那么高,vfork 变得毫无用处。
该网站的手册确实很有启发性。
作为一个来自过去的幽灵,他生动地描述了自己。
现在看看 BSD 警告,确实是一个预言。

说到克隆就更有趣了。
我分享过 Linux 容器项目,核心模块中到处都有克隆痕迹。
它不像fork那么粗糙,并且可以表达新进程的隔离空间(如PID、UTS、IPC等)。
有一个具体场景让我印象特别深刻:使用clone作为线程创建时,可以有选择地继承父进程的内存分配,这样可以节省很多开销。
请记住,在尝试高并发服务时,使用克隆创建线程比直接 fork 快不到 3 0%,因为它避免了复制所有堆空间。
但克隆体上有一个洞。
子进程的启动函数必须在clone参数中定义。
与分叉不同,电子邮件进程返回默认父进程。
这些必须得到满足。

最后我想提一下我的经历。
一位同事使用clone来做多线程,但他忘记指定CLONE_VM参数,因为所有线程都属于同一内存,结果导致数据损坏并崩溃。
当我查看内核日志时,我差点把咖啡吐出来——CLONE_VM属性比简单地理解进程的线程是轻的要重要得多。
我个人对这方面的Cgroup隔离并不熟悉,但是我听说当前的技术包含很多基于克隆变体的隔离机制。

《你应该如何学习Linux》这本书确实入门友好,但为了克隆其中的插图,我建议你查看内核代码。
尤其是clone3 结构体参数,Linux社区现在推荐使用clone3 ,而不是clone2 ,参数更丰富,也更安全。
您需要确认您可以更新 3 w.linuxprobe 链接。
核心版本迭代很快,一些API注释不再准确。

Linux中fork,vfork和clone详解(区别与联系)

说白了,Linux的fork、vfork和clone是三种创建新进程的工具,但它们在资源复制和适用场景上有很大区别。

我们先来说说最重要的事情。
Fork会完全复制原进程的资源。
最初,父子共享内存,写入数据时进行复制。
去年我们做的一个高并发项目中,使用fork直接导致父进程的内存减慢高达3 0%,因为子进程疯狂写入日志,无法及时复制。
还有一点是vfork是fork的轻量级版本。
子进程直接共享内存,因此修改会传递给父进程。
,去年当我们编写编译器时,我们有点爆炸了。
最后我们看到子进程中必须立即执行或者退出,否则就是死循环;还有另一个重要的细节。
克隆功能是最不寻常的。
您可以准确控制共享内容,例如线程共享地址空间。
去年我们实现容器沙箱的时候,使用clone+CLONE_NEWNS来隔离文件系统,比fork效率高5 0%。

一开始我以为clone最复杂,后来发现vfork的陷阱更多,比如无法回退退出子进程;等等,还有一件事。
事实上,写时复制对他们来说是一种流行的优化,但复制可以有更细粒度的控制,例如仅共享文件描述符而不共享文件系统。

不要直接使用fork处理大量数据,尝试clone+CLONE_VM。

Linux中fork函数详解

这是一个叉子。
子进程返回0,父进程返回子PID。
写时复制是关键。
不要忘记添加等待时间。

立即调用 exec 来交换地址空间。