我正在开发我的应用程序(在Linux上),遗憾的是它有时会挂起.我可以Ctrl+C用来发送sigint,但我的程序忽略了sigint,因为它太过分了.所以我必须做过程杀死舞蹈:
Ctrl+Z
$ ps aux | grep process_name
$ kill -9 pid
Run Code Online (Sandbox Code Playgroud)
有没有办法配置bash在我按下时将kill信号发送到当前进程 - 比如说Ctrl+Shift+C?
我正在为C++中的内存有限的嵌入式系统(Tegra 2)开发应用程序.我处理的NULL结果new和new[]整个有时会发生,但应用程序能够处理这个代码.
问题是如果内存完全耗尽,系统会通过SIGKILL杀死进程.我可以告诉你new应该只返回NULL而不是杀死进程吗?
我刚拿到了iPhone SDK 4,而我正试图开发一个我之前正在开发的应用程序.所以我实现了两个
-(void)applicationDidEnterBackground:(UIApplication *)application
和- (void)applicationWillTerminate:(UIApplication *)application
当我单击模拟器4.0中的主页按钮时,它似乎工作正常.应用程序调用 -(void)applicationDidEnterBackground:(UIApplication *)application并进入后台状态..
但是,我然后双击主页按钮以显示在后台运行的应用程序,并按住它以显示减号或退出.当我点击减号时,调试器说
节目收到信号:"SIGKILL"
此外,- (void)applicationWillTerminate:(UIApplication *)application永远不会被称为.我错过了我需要做的事情才能在OS4上工作吗?或者至少可以有人指出我调试SIGKILL的方法.谢谢.
我希望有人可以帮我弄清楚发生了什么.
我正在开发一款iPhone游戏cocos2d framework.我不时因SIGKIL信号而停止代码.如果我按"继续"按钮,游戏继续没有任何问题.控制台日志是明确的(没有错误或警告消息)我在我的自定义类上得到它,使用绘制一个纹理化的矩形OpenGL.这段代码每秒执行大约300次,SIGKILL每1-2小时只能运行一次.
这是一段代码:
glColor4f(1.f, 1.f, 1.f, 1.f);
i = 1;
glBindTexture(GL_TEXTURE_2D, curText);
glVertexPointer(2, GL_FLOAT, 0, screenCoord [i]);
glTexCoordPointer(2, GL_FLOAT, 0, textureCoord [i]);
SIGKIL --> glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
Run Code Online (Sandbox Code Playgroud)
这是当时阵列的内容:
(gdb) p *screenCoord[1]@8
$8 = {0, 296, 249.827072, 296, 0, -0, 249.827072, -0}
(gdb) p *textureCoord[1]@8
$12 = {0.456224144, 0.29296875, 0.700195312, 0.29296875, 0.456224144, 0.58203125, 0.700195312, 0.58203125}
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪:
#0 0x123028a7 in <????> ()
#1 0x12301528 in <????> ()
#2 0x0a767092 in gldRenderFillPolygonPtr ()
#3 …Run Code Online (Sandbox Code Playgroud) 关于将信号9(SIGKILL)发送到init进程(PID 1),我遇到了一个奇怪的问题.您可能知道,SIGKILL不能通过信号处理程序忽略.当我尝试将SIGKILL发送给init时,我发现没有发生任何事情; init不会被终止.试图弄清楚这种行为,我决定将自己附加到使用strace的init进程,也可以更清楚地看到发生了什么.现在是奇怪的部分.如果我用strace"查看"init进程并发送SIGKILL,系统崩溃了.
我的问题是为什么会发生这种情况?为什么在我查看流程时系统崩溃,为什么在我不这样做时它不会崩溃?正如我所说,在这两种情况下我都将SIGKILL发送给init.在CentOS 6.5,Debian 7和Arch上测试过.
谢谢!
我想知道是否有办法从OOM杀手那里抓住sigkill.我有一个任务队列,每隔一段时间就会创建一个由OOM杀死的庞大任务.这个:
catch Exception as ex:
# clean up!
Run Code Online (Sandbox Code Playgroud)
不起作用,因为SIGKILL无法被抓住.所以........在SIGKILL之后有什么策略可以清理吗?我可以分叉,看看孩子的过程吗?如果是这样,子进程打开的任何资源都必须事先由父母知道?或者我可以做一些版本的
ps -ef | grep <child pid> | xargs kill -9 (you get the idea...)
Run Code Online (Sandbox Code Playgroud)
目前,如果我在OOM杀死后没有清理,我会留下大量的子进程和其他事情,这些事情只会在重试任务时变得更糟,很快就会无法访问服务器.
最后,这样做是否足够:
kill -9 <process id>
Run Code Online (Sandbox Code Playgroud)
测试这种确切的情况?
非常感谢!
我有一个进程在执行程序后立即被杀死.这是已编译的可执行文件的代码,它是一个小程序,它读取由标准输入(通常是描述性文件)中的数字表示的多个图形,并使用Prim算法找到每个图形的最小生成树(它不显示结果,它只是找到解决方案).
#include <stdlib.h>
#include <iostream>
using namespace std;
const int MAX_NODOS = 20000;
const int infinito = 10000;
int nnodos;
int nAristas;
int G[MAX_NODOS][MAX_NODOS];
int solucion[MAX_NODOS][MAX_NODOS];
int menorCoste[MAX_NODOS];
int masCercano[MAX_NODOS];
void leeGrafo(){
if (nnodos<0 || nnodos>MAX_NODOS) {
cerr << "Numero de nodos (" << nnodos << ") no valido\n";
exit(0);
}
for (int i=0; i<nnodos ; i++)
for (int j=0; j<nnodos ; j++)
G[i][j] = infinito;
int A,B,P;
for(int i=0;i<nAristas;i++){
cin >> A >> B >> P;
G[A][B] = P; …Run Code Online (Sandbox Code Playgroud) 如果一个linux进程正在等待I/O(即它处于SLEEP状态)并且SIGKILL发出一个信号,那么在终止(STOPPED状态)时它会通过RUNNING还是READY状态?
换句话说,对于一个处理系统中断的过程,例如一个生成的系统中断SIGKILL是否需要通过RUNNING或READY状态?
知道在正常情况下一个进程可以处理来自内核的中断并且知道SIGKILL有一个非常矛盾的目的是杀死一个无响应的信号,我怀疑对被杀死的进程有多少控制权,如果有的话.
我在Go中创建了一个程序来杀死一个进程 syscall.Kill()
但是,如果我使用fork()+ 继续该过程,setsid()则syscall.Kill()不会杀死该过程.
如果我使用shell,kill那么在这两种情况下我都能够杀死那个进程.
我尝试了不同的信号:SIGINT,SIGTERM和SIGKILLbuthey不杀守护进程.
我正在编写一个程序,在一个进程中创建多个线程。
我需要处理如果进程被某人使用kill -9信号或Ctrl + C从外部终止,我的程序应该在关闭之前执行一些操作,例如它应该将进程的状态更改为数据库中的中止。
我该如何处理?
我需要addShutdownHook()?或者还有其他更好的解决方案来解决我的问题吗?
我已经添加了 :
Runtime.getRuntime().addShutdownHook( new Thread() {
@Override
public void run() {
logger.info( "Running Shutdown Hook" );
//call some method
System.out.println( "Running Shutdown Hook" );
}
} );
Run Code Online (Sandbox Code Playgroud)
在我的主要方法中,但它似乎不起作用。