fork()可以把 linux 系统资源占完么?

2015-08-08 20:11:43 +08:00
 supman
大概在自己服务器上循环了10分钟, 但是没什么反应啊。。
while(2==0)
{
fork();
}
2705 次点击
所在节点    问与答
14 条回复
echo1937
2015-08-08 20:18:43 +08:00
你试试fork炸弹就知道了。
Strikeactor
2015-08-08 20:19:06 +08:00
while false什么鬼
wy315700
2015-08-08 20:24:44 +08:00
while(false) 你跑10年都不会有效果
rrfeng
2015-08-08 20:25:04 +08:00
你敢贴上这个么
:(){:|:&};:
jasontse
2015-08-08 20:35:14 +08:00
会把 PID 号码吃完
supman
2015-08-08 20:38:08 +08:00
@echo1937
@Strikeactor
@wy315700
@rrfeng
@jasontse


错了错了。。。是while true。。。。 但是服务器还是好好的。。
ihciah
2015-08-08 20:51:22 +08:00
上次出去玩,逛到一家苹果专卖店,扔了一个炸弹也是没反应,差评
echo1937
2015-08-08 20:58:43 +08:00
@supman 把你的脚本写成递归调用再说。
xierch
2015-08-08 21:11:26 +08:00
最坑的是 fork() 失败后还要 kill()
xl2tpd 里就有这个 bug,kill(-1, TERM),呵呵呵,不知道修好了没有
mind3x
2015-08-09 00:14:51 +08:00
fork()是copy on write的好吗...你单纯跑fork,能占的资源很有限。

Under Linux, fork() is implemented using copy-on-write pages, so the only penalty that it incurs is the time and memory required to duplicate the parent's page tables, and to create a unique task structure for the child.
sleeperqp
2015-08-09 00:23:45 +08:00
fork会占完linux的进程管理资源 而不是整个内存的资源 (进程管理资源在内存中)
因为linux管理进程是用一个结构体(task_struct)数组来管理进程的 这个数组是固定的 也就说系统所管理的进程数一定 因此不断fork是会耗尽这个结构体的
pid是一个unsiged int数 是循环使用的 因此首先耗尽的应该是结构体数组 而不是pid
上面说的copy on write是对的 当你不对新fork的进程进行写操作时 这些进程所管理的内存页实际是一样的 新增的进程只需要让内存页的计数加一 然后管理的页表项指向内存也即可 因此内存消耗较小
tracyone
2015-08-09 00:25:30 +08:00
似乎有限制一个程序里面进程数的…
q5we66fg
2015-08-09 11:16:04 +08:00
每个进程好像又现在最大内存,不知道会不会swap
binyuJ
2015-08-09 15:31:22 +08:00
我在.bashrc 里加了个diff() { diff -u "$@" }
结果只要一打diff直接就不响应了,只能按电源
看kenerl log 里面就是出了无限循环内存耗尽

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/211800

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX