本篇部落格作為memcached原始碼分析的開篇,這次閱讀的原始碼版本為:1.4.15,開源軟體各個版本之間差異比較大,同學們學習時,記得核對版本。
memcached的main函式位於memcached.c檔案中,從main函式啟動之後,會初始化一些資源和申請一些伺服器資源,如下面所示:
1 core檔案大小和程序開啟檔案個數限制的調整。
[cpp]view plain
copy
if(maxcore != 0)
} //再次確認core檔案允許的大小,如果當前的core檔案的大小為0,則不允許core檔案產生,和maxcore!=0不符,程式結束
if((getrlimit(rlimit_core, &rlim) != 0) || rlim.rlim_cur == 0)
} //讀取程序允許開啟的檔案數資訊,讀取失敗,程式退出
if(getrlimit(rlimit_nofile, &rlim) != 0)
else
} 2 啟動使用者的選擇。
[cpp]view plain
copy
//uid==0表示以root執行程式
if(getuid() == 0 || geteuid() == 0)
//判斷是否存在指定的使用者名稱
if((pw = getpwnam(username)) == 0)
//按新的使用者修改memcached的執行許可權位
if(setgid(pw->pw_gid) pw_uid)
} 3 以daemon的方式啟動,daemon的實現如下,該daemon沒有進行2次fork,apue上面也有說第二次fork不是必須的。
[cpp]view plain
copy
intdaemonize(
intnochdir,
intnoclose)
//setsid呼叫成功之後,返回新的會話的id,呼叫setsid函式的程序成為新的會話的領頭程序,並與其父程序的會話組和程序組脫離
if(setsid() == -1)
return
(-1);
if(nochdir == 0)
} if
(noclose == 0 && (fd = open(
"/dev/null"
, o_rdwr, 0)) != -1)
if(dup2(fd, stdout_fileno)
if(dup2(fd, stderr_fileno)
if(fd > stderr_fileno)
} }
return
(0);
}
4 鎖定記憶體,預設分配的記憶體都是虛擬記憶體,在程式執行過程中可以按需換出,如果記憶體充足的話,可以鎖定記憶體,不讓系統將該程序所持有的記憶體換出。
[cpp]view plain
copy
if(lock_memory)
#else
fprintf(stderr,
"warning: -k invalid, mlockall() not supported on this platform. proceeding without.\n"
);
#endif
}
5 忽略pipe訊號,pipe訊號是當網路連線一端已經斷開,這時傳送資料,會進行rst的重定向,再次傳送資料,會觸發pipe訊號,而pipe訊號的預設動作是退出程序,所以需要忽略該訊號。
[cpp]view plain
copy
if(sigignore(sigpipe) == -1)
6 儲存daemon程序的程序id到檔案中,這樣便於控制程式,讀取檔案內容,即可得到程序id。
[cpp]view plain
copy
if(pid_file != null)
原始碼閱讀 Glide原始碼閱讀之with方法(一)
前言 本篇基於4.8.0版本 原始碼閱讀 glide原始碼閱讀之with方法 一 原始碼閱讀 glide原始碼閱讀之load方法 二 原始碼閱讀 glide原始碼閱讀之into方法 三 大多數情況下,我們使用glide 就一句 但是這一句 裡面蘊含著成噸的 with方法有以下幾個過載方法 publi...
原始碼閱讀 Glide原始碼閱讀之load方法(二)
原始碼閱讀 glide原始碼閱讀之load方法 二 原始碼閱讀 glide原始碼閱讀之into方法 三 首先,load方法有以下幾個過載方法 public requestbuilder load nullable bitmap bitmap public requestbuilder load nu...
《原始碼閱讀》原始碼閱讀技巧,原始碼閱讀工具
檢視某個類的完整繼承關係 選中類的名稱,然後按f4 quick type hierarchy quick type hierarchy可以顯示出類的繼承結構,包括它的父類和子類 supertype hierarchy supertype hierarchy可以顯示出類的繼承和實現結構,包括它的父類和...