1. linux socket 服务端程序 无缘无故退出 。
2. 客户端大量访问服务端后,出现 Resource temporarily unavailable错误
问题分析:1.
是否有代码问题出现段错误
发现没有任何错误输出,查看(ulimit -a )并打开 (ulimit -c unlimited) core输出 也没有core 文件产生。
后面发现,控制台 后台启动程序( nohup ./xxx & )在程序退出的时候能看到退出原因
此处我的server是http服务 我的问题 客户端访问服务端 不等待服务端能响应完整, 直接断开。 此处浏览器f5刷新程序实现。
2. 网上查找 Resource temporarily unavailable 相关问题
ps -T -p pID 查看进程pID 有多少子进程 发现子进程都退出了。
最后,查找网络 发现应该是子线程回收问题,没有释放资源。
解决:
1. SIGPIPE 信号的产生使进程退出了,所以在程序开始增加下面语句就可以
忽略管道类写错误, 因为我此处 tcp客户端关闭 服务端没有对所有send做判断是 会出现写错误 触发SIGPIPE,信号。
signal(SIGPIPE,SIG_IGN)
备注: 最好的解决方法还是 在每一个调用系统 读写的时候 都有有效的判断和处理。
2. 线程资源没有合理释放。 下面代码在创建线程的时候设置线程为detached 脱离的,退出自动清理资源。
pthread_attr_t attr;
pthread_t thread;
pthread_attr_init (&attr);
pthread_attr_setdetachstate (&attr,PTHREAD_CREATE_DETACHED);
rc = pthread_create(&pID,&attr,PrintHello,NulL);
pthread_attr_destroy (&attr);
程序SIGPIPE退出
https://www.cnblogs.com/fgokey/p/5949004.HTML
线程创建
http://www.cppblog.com/prayer/archive/2012/04/23/172427.HTML
转:
http://www.cppblog.com/prayer/archive/2012/04/23/172427.HTML
这两天在看Pthread 资料的时候,无意中看到这样一句话(man pthread_detach):
Either pthread_join(3) or pthread_detach() should be called for each thread
that an application creates,so that system resources for the thread can be
released. (But note that the resources of all threads are freed when the
process terminates.)
也就是说:每个进程创建以后都应该调用pthread_join 或 pthread_detach 函数,只有这样在线程结束的时候资源(线程的描述信息和stack)才能被释放.
之后又查了pthread_join 但是没有明确说明必须调用pthread_join 或 pthread_detach.
但是再查了 Pthread for win32 pthread_join
When a joinable thread terminates,its memory resources (thread descriptor and stack) are not deallocated until another thread performs pthread_join on it. Therefore,pthread_join must be called once for each joinable thread created to avoID memory leaks.
才知道如果在新线程里面没有调用pthread_join 或 pthread_detach会导致内存泄漏,如果你创建的线程越多,你的内存利用率就会越高,直到你再无法创建线程,最终只能结束进程。
解决方法有三个:
1. 线程里面调用 pthread_detach(pthread_self()) 这个方法最简单
2. 在创建线程的设置PTHREAD_CREATE_DETACHED属性
3. 创建线程后用 pthread_join() 一直等待子线程结束。
下面是几个简单的例子
1. 调用 pthread_detach(pthread_self())
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
voID *PrintHello(voID)
{
pthread_detach(pthread_self());
int stack[1024 * 20] = {0,};
//sleep(1);
long tID = 0;
//printf(“Hello World! It’s me,thread #%ld!\n”,tID);
//pthread_exit(NulL);
}
int main (int argc,char *argv[])
{
pthread_t pID;
int rc;
long t;
while (1) {
printf(“In main: creating thread %ld\n”,t);
rc = pthread_create(&pID,NulL,NulL);
if (rc){
printf(“ERROR; return code from pthread_create() is %d\n”,rc);
//exit(-1);
}
sleep(1);
}
printf(” \n— main End —- \n”);
pthread_exit(NulL);
}
2. 在创建线程的设置PTHREAD_CREATE_DETACHED属性
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
voID *PrintHello(voID)
{
int stack[1024 * 20] = {0,};
//pthread_exit(NulL);
//pthread_detach(pthread_self());
}
int main (int argc,t);
pthread_attr_t attr;
pthread_t thread;
pthread_attr_init (&attr);
pthread_attr_setdetachstate (&attr,NulL);
pthread_attr_destroy (&attr);
if (rc){
printf(“ERROR; return code from pthread_create() is %d\n”,rc);
//exit(-1);
}
sleep(1);
}
printf(” \n— main End —- \n”);
pthread_exit(NulL);
}
3. 创建线程后用 pthread_join() 一直等待子线程结束。
#include <stdio.h>#include <stdlib.h>#include <pthread.h>voID *PrintHello(voID){int stack[1024 * 20] = {0,};//sleep(1);long tID = 0;//pthread_exit(NulL);//pthread_detach(pthread_self());}int main (int argc,char *argv[]){pthread_t pID;int rc;long t;while (1) {printf(“In main: creating thread %ld\n”,t);rc = pthread_create(&pID,NulL);if (rc){printf(“ERROR; return code from pthread_create() is %d\n”,rc);//exit(-1);}pthread_join(pID,NulL);sleep(1);}printf(” \n— main End —- \n”);pthread_exit(NulL);}
总结以上是内存溢出为你收集整理的linux 程序无缘无故推出 没有core文件 broken pipe Resource temporarily unavailable全部内容,希望文章能够帮你解决linux 程序无缘无故推出 没有core文件 broken pipe Resource temporarily unavailable所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)