linux 程序無緣無故推出 沒有core文件 broken pipe Resource temporarily unavailable
問題
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退出
線程創建
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, PrintHello, 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, char *argv[])
{
pthread_t pid;
int rc;
long t;
while (1) {
printf(“In main: creating thread %ld\n”, t);
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);
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, PrintHello, 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