当前位置: 技术问答>linux和unix
linux suse11遇到的信号问题以及一个coredump,想请教各路大神
来源: 互联网 发布时间:2017-03-31
本文导语: 话就不多说,直接上问题。 1、信号问题: fd_set rset; FD_ZERO(&rset); FD_SET(g_fdSocket, &rset); //设置接收连接超时时间 struct timeval waitTime; waitTime.tv_sec = 1; waitTime.tv_usec = 0; select(g_fdSocket + 1, &rset, NULL, NULL, &waitTime); ...
话就不多说,直接上问题。
1、信号问题:
fd_set rset;
FD_ZERO(&rset);
FD_SET(g_fdSocket, &rset);
//设置接收连接超时时间
struct timeval waitTime;
waitTime.tv_sec = 1;
waitTime.tv_usec = 0;
select(g_fdSocket + 1, &rset, NULL, NULL, &waitTime);
这一段代码,应该是会被阻塞,直到超时或者文件句柄g_fdSocket状态更新为对IO操作为ready。
本来工作也是正常的,但是假如我从控制台输入kill -15的时候,竟然会触发其终止阻塞。代码里面raise(15)与raise(8)却不会终止其阻塞。而且我代码里面如果使用了alarm闹钟,则闹钟时间到时也会终止其阻塞,而raise(SIGALRM)却不会终止。求解。
2、一个coredump的问题。一个网络多线程带信号处理的一个后台程序。我的程序运行得平常都很正常,但偶尔会coredump。用gdb查看堆栈信息的时候,却很郁闷的发现代码的最后一行运行在LOG("……");这样的代码行上,我怀疑日志出问题了,于是注释掉这句话,接着,花了很多遍重复,终于重现core的时候,发现更郁闷的事情发生了,core在了被注释掉的这句话的下一行。char mzchar[256];这样一个变量声明的语句上。错误的类型是11号信号段错误。coredump的这个方法是一个语法树里面的解析语法树的方法,因为一个表达式很长,语法树可能会层次很多,就是根树会调用这个方法去遍历解析他的儿子辈的。儿子当然也会调用这个方法去解析孙子辈分的,依次下去。这个方法是对象方法。还有一个信息就是这个coredump,我测很多遍,很大可能性是发生在程序退出的时候,被外部程序调用kill -9发送SIGKILL信号时发生的。我一直认为SIGKILL信号时不会发生coredump的。想请各路大神给点思路或者建议
1、信号问题:
fd_set rset;
FD_ZERO(&rset);
FD_SET(g_fdSocket, &rset);
//设置接收连接超时时间
struct timeval waitTime;
waitTime.tv_sec = 1;
waitTime.tv_usec = 0;
select(g_fdSocket + 1, &rset, NULL, NULL, &waitTime);
这一段代码,应该是会被阻塞,直到超时或者文件句柄g_fdSocket状态更新为对IO操作为ready。
本来工作也是正常的,但是假如我从控制台输入kill -15的时候,竟然会触发其终止阻塞。代码里面raise(15)与raise(8)却不会终止其阻塞。而且我代码里面如果使用了alarm闹钟,则闹钟时间到时也会终止其阻塞,而raise(SIGALRM)却不会终止。求解。
2、一个coredump的问题。一个网络多线程带信号处理的一个后台程序。我的程序运行得平常都很正常,但偶尔会coredump。用gdb查看堆栈信息的时候,却很郁闷的发现代码的最后一行运行在LOG("……");这样的代码行上,我怀疑日志出问题了,于是注释掉这句话,接着,花了很多遍重复,终于重现core的时候,发现更郁闷的事情发生了,core在了被注释掉的这句话的下一行。char mzchar[256];这样一个变量声明的语句上。错误的类型是11号信号段错误。coredump的这个方法是一个语法树里面的解析语法树的方法,因为一个表达式很长,语法树可能会层次很多,就是根树会调用这个方法去遍历解析他的儿子辈的。儿子当然也会调用这个方法去解析孙子辈分的,依次下去。这个方法是对象方法。还有一个信息就是这个coredump,我测很多遍,很大可能性是发生在程序退出的时候,被外部程序调用kill -9发送SIGKILL信号时发生的。我一直认为SIGKILL信号时不会发生coredump的。想请各路大神给点思路或者建议
|
问题1,raise()是发送signal给calling线程
raise(3) Sends a signal to the calling thread.
kill(2) Sends a signal to a specified process, to all members of a specified process group, or to all processes on the system.
你在select阻塞的时候,一定是另起了一个线程来raise() signal吧?
这样的话,你raise的信号是不会被select线程收到的,所以无法中断阻塞
问题2有可能是栈出问题了,因为你log函数参数要压栈,char mzchar[256]更是要分配栈空间
所以你要仔细地检查代码,是否有buff/数组溢出这样的问题
raise(3) Sends a signal to the calling thread.
kill(2) Sends a signal to a specified process, to all members of a specified process group, or to all processes on the system.
你在select阻塞的时候,一定是另起了一个线程来raise() signal吧?
这样的话,你raise的信号是不会被select线程收到的,所以无法中断阻塞
问题2有可能是栈出问题了,因为你log函数参数要压栈,char mzchar[256]更是要分配栈空间
所以你要仔细地检查代码,是否有buff/数组溢出这样的问题