我正在C尝试使用客户端 - 服务器应用来模拟纸牌游戏。 这是一对一游戏,客户在线程工作者的帮助下玩游戏(每场比赛一名工作人员)。我试图做一些测试但是,在某些时候,没有任何理由,服务器已经崩溃了。代码中充满了检查,试图以各种方式安全地结束它。发布所有代码是不可想象的,但这是计算的结果(我重复了10次以上获得相同的结果):
worker: Start Playing!
worker: hand number: 0
worker: player pluto playing on port 6!
Killed
任何可能的原因?别人遇到同样的问题?
答案 0 :(得分:2)
当您的程序从其他某个程序或脚本kill -9
出现时,会发生这种情况。
一个常见的神秘进程杀手是Linux out-of-memory (OOM) killer。在Linux下,当程序分配太多内存时,您不会从malloc()
返回NULL,也不会从new
运算符返回异常。相反,你的程序很可能是内核kill -9
。
Linux有一个奇怪的(但是明智的)策略,它允许进程根据需要分配尽可能多的内存,即使没有足够的内存来满足请求。这是因为许多程序会乐观地分配大量内存,但实际上并没有使用所有内存。 Linux允许程序分配他们想要的任何东西,并且只有当他们尝试访问该内存时,Linux才会检查内存是否存在。
如果没有,则内核处于绑定状态,因为它告诉程序内存可用(即malloc()
之前返回了一个有效的指针),现在它已被骗了。没有好方法向oops程序发出错误信号,我犯了一个错误,我应该早点返回NULL。
这就是OOM杀手的所在.OOM杀手就像是一家超额预订航班的航空公司,现在不得不说服付费客户不要乘坐该航班。我知道你付了钱,但也许有人愿意接受以后的飞行?
内核无法满足内存请求,那么它能做什么呢?它可以说“抱歉,我撒谎”并杀死当前的程序。或者它可以杀死其他程序以释放内存,直到当前程序有足够的空闲时间。 OOM杀手试图充分利用糟糕的情况。它试图弄清楚最好杀死的程序是什么,以尽量减少损害。如果有一些新开始的程序正在咀嚼巨大的记忆,那就是它会被杀死的人。这是有道理的。程序中有一个错误很可能导致它分配太多内存。
或者考虑另一种可能性:你的程序是完全无辜的,但是一些其他程序行为不端,而OOM杀手决定杀死你的。
我不知道这是不是正在发生的事情。但是,当我听到“我的节目被无缘无故地杀死”时,我想OOM killer,因为我之前被这个混蛋焚烧了。
答案 1 :(得分:0)
“已杀”是您的计划收到SIGKILL
时打印的消息。 SIGKILL
不可捕获或可屏蔽,这意味着它可以保证杀死你的程序(SIGKILL
通常是信号9,导致通用习惯用kill -9 <pid>
杀死进程。
如果你没有在某处触发kill -9
,那么可能的罪魁祸首就是OOM杀手。 @JohnKugelman给出了杀手的一个很好的概述。
您可以通过查看/var/log/messages
:
grep -i 'killed process' /var/log/messages