1ãå®æ¤è¿ç¨ï¼ä¹å°±æ¯é常说çDaemonè¿ç¨ï¼æ¯Linuxä¸çåå°æå¡è¿ç¨ãå®æ¯ä¸ä¸ªçåæè¾é¿çè¿ç¨ï¼é常ç¬ç«äºæ§å¶ç»ç«¯å¹¶ä¸å¨ææ§å°æ§è¡æç§ä»»å¡æçå¾
å¤çæäºåççäºä»¶ãå¦ææ³è®©æ个è¿ç¨ä¸å 为ç¨æ·æç»ç«¯æå
¶ä»å°ååèåå°å½±åï¼é£ä¹å°±å¿
é¡»æè¿ä¸ªè¿ç¨åæä¸ä¸ªå®æ¤è¿ç¨ã
2ãå建å®æ¤è¿ç¨æ¥éª¤
1ï¼å建åè¿ç¨ï¼ç¶è¿ç¨éåº
ä¹åçææå·¥ä½é½å¨åè¿ç¨ä¸å®æï¼èç¨æ·å¨Shellç»ç«¯éåå¯ä»¥æ§è¡å
¶ä»å½ä»¤ï¼ä»èå¨å½¢å¼ä¸åå°äºä¸æ§å¶ç»ç«¯çè±ç¦»ã
å¨Linuxä¸ç¶è¿ç¨å
äºåè¿ç¨éåºä¼é æåè¿ç¨æ为å¤å¿è¿ç¨ï¼èæ¯å½ç³»ç»åç°ä¸ä¸ªå¤å¿è¿ç¨æ¶ï¼å°±ä¼èªå¨ç±1å·è¿ç¨ï¼initï¼æ¶å
»å®ï¼è¿æ ·ï¼åå
çåè¿ç¨å°±ä¼åæinitè¿ç¨çåè¿ç¨ã
2ï¼å¨åè¿ç¨ä¸å建æ°ä¼è¯
è¿ç¨ç»ï¼æ¯ä¸ä¸ªæå¤ä¸ªè¿ç¨çéåãè¿ç¨ç»æè¿ç¨ç»IDæ¥å¯ä¸æ è¯ãé¤äºè¿ç¨å·ï¼PIDï¼ä¹å¤ï¼è¿ç¨ç»IDä¹æ¯ä¸ä¸ªè¿ç¨çå¿
å¤å±æ§ãæ¯ä¸ªè¿ç¨ç»é½æä¸ä¸ªç»é¿è¿ç¨ï¼å
¶ç»é¿è¿ç¨çè¿ç¨å·çäºè¿ç¨ç»IDãä¸è¯¥è¿ç¨ç»IDä¸ä¼å ç»é¿è¿ç¨çéåºèåå°å½±åã
ä¼è¯å¨æï¼ä¼è¯ææ¯ä¸ä¸ªæå¤ä¸ªè¿ç¨ç»çéåãé常ï¼ä¸ä¸ªä¼è¯å¼å§äºç¨æ·ç»å½ï¼ç»æ¢äºç¨æ·éåºï¼å¨æ¤æé´è¯¥ç¨æ·è¿è¡çææè¿ç¨é½å±äºè¿ä¸ªä¼è¯æã
ï¼1ï¼pid_t setsid(void);
setsid() creates a new session if the calling process is not a process group leader. The calling process will be the only process in this new process group and in this new session.
setsidå½æ°ç¨äºå建ä¸ä¸ªæ°çä¼è¯ï¼å¹¶æ
任该ä¼è¯ç»çç»é¿ãè°ç¨setsidæä¸é¢ç3个ä½ç¨ï¼
â 让è¿ç¨æè±åä¼è¯çæ§å¶
⡠让è¿ç¨æè±åè¿ç¨ç»çæ§å¶
⢠让è¿ç¨æè±åæ§å¶ç»ç«¯çæ§å¶
æ以ä¸ä¸ä¸ªç»æï¼
ï¼a)æ为æ°ä¼è¯çé¦è¿ç¨
ï¼bï¼æ为ä¸ä¸ªæ°è¿ç¨ç»çç»é¿è¿ç¨
ï¼cï¼æ²¡ææ§å¶ç»ç«¯ã
æäºäººå»ºè®®å¨æ¤æ¶å次è°ç¨forkï¼å¹¶ä½¿ç¶è¿ç¨ç»æ¢ã第äºä¸ªåè¿ç¨ä½ä¸ºå®æ¤è¿ç¨ç»§ç»è¿è¡ãè¿æ ·å°±ä¿è¯äºè¯¥å®æ¤è¿ç¨ä¸æ¯ä¼è¯é¦è¿ç¨ã
setsidå½æ°è½å¤ä½¿è¿ç¨å®å
¨ç¬ç«åºæ¥ï¼ä»èæè±å
¶ä»è¿ç¨çæ§å¶ã
setsid()è°ç¨æååï¼è¿ç¨æ为æ°çä¼è¯ç»é¿åæ°çè¿ç¨ç»é¿ï¼å¹¶ä¸åæ¥çç»å½ä¼è¯åè¿ç¨ç»è±ç¦»ãç±äºä¼è¯è¿ç¨å¯¹æ§å¶ç»ç«¯çç¬å æ§ï¼è¿ç¨åæ¶ä¸æ§å¶ç»ç«¯è±ç¦»ã åè¿ç¨å¯ä»¥èªå·±ç»æä¸ä¸ªæ°çè¿ç¨ç»,å³è°ç¨setpgrp()ä¸åè¿ç¨ç»è±ç¦»å
³ç³»,产çä¸ä¸ªæ°çè¿ç¨ç»,è¿ç¨ç»å·ä¸å®çè¿ç¨å·ç¸å.è¿æ ·,ç¶è¿ç¨éåºè¿è¡åå°±ä¸ä¼å½±ååè¿ç¨çå½åè¿è¡.
3ï¼æ¹åå½åç®å½ä¸ºæ ¹ç®å½
使ç¨forkå建çåè¿ç¨ç»§æ¿äºç¶è¿ç¨çå½åå·¥ä½ç®å½ï¼è¿ç¨æ´»å¨æ¶ï¼å
¶å·¥ä½ç®å½æå¨çæ件系ç»ä¸è½å¸ä¸ãé常çåæ³æ¯è®©"/"ä½ä¸ºå®æ¤è¿ç¨çå½åå·¥ä½ç®å½ï¼ä¹å¯ä»¥æ¯å
¶ä»ç®å½ï¼å¦/tmpï¼ä½¿ç¨chdirã
4ï¼é设æ件æéæ©ç
æ件æéæ©ç æ¯æå±è½ææ件æéä¸ç对åºä½ãæ¯å¦ï¼æ个æ件æéæ©ç æ¯050ï¼å®å°±å±è½äºæ件ç»æ¥æè
çå¯è¯»ä¸å¯æ§è¡æéãmask = mask & ~050
é常ï¼ææ件æéæ©ç 设置为0ï¼umask(0)ã
5ï¼å
³éæ件æ述符
ç¨forkå½æ°æ°å»ºçåè¿ç¨ä¼ä»ç¶è¿ç¨é£é继æ¿å·²ç»æå¼äºçæ件æ述符ãè¿äºè¢«æå¼çæ件å¯è½æ°¸è¿ä¸ä¼è¢«å®æ¤è¿ç¨è¯»åï¼ä½å®ä»¬ä¸æ ·æ¶èç³»ç»èµæºï¼èä¸å¯è½å¯¼è´æå¨çæ件系ç»æ æ³å¸ä¸ã
å¨ä¸é¢ç第äºæ¥ä¹åï¼å®æ¤è¿ç¨å·²ç»ä¸æå±çæ§å¶ç»ç«¯å¤±å»äºèç³»ãå æ¤ä»ç»ç«¯è¾å
¥çå符ä¸å¯è½è¾¾å°å®æ¤è¿ç¨ï¼å®æ¤è¿ç¨ä¸ç¨å¸¸è§æ¹æ³ï¼å¦printfï¼è¾åºçå符ä¹ä¸å¯è½å¨ç»ç«¯ä¸æ¾ç¤ºåºæ¥ãæ以ï¼æ件æ述符为0ã1å2 ç3个æ件ï¼å¸¸è¯´çè¾å
¥ãè¾åºåæ¥éï¼å·²ç»å¤±å»äºåå¨çä»·å¼ï¼ä¹åºè¢«å
³éã
for(i=0;i<MAXFILE;i++)
close(i);
6ï¼å®æ¤è¿ç¨éåºå¤ç
å½ç¨æ·éè¦å¤é¨åæ¢å®æ¤è¿ç¨è¿è¡æ¶ï¼å¾å¾ä¼ä½¿ç¨ killå½ä»¤åæ¢è¯¥å®æ¤è¿ç¨ãæ以ï¼å®æ¤è¿ç¨ä¸éè¦ç¼ç æ¥å®ç°killååºçsignalä¿¡å·å¤çï¼è¾¾å°è¿ç¨çæ£å¸¸éåºã
signal(SIGTERM, sigterm_handler);
void sigterm_handler(int arg)
{
_running = 0;
}
7ï¼å¤çSIGCHLDä¿¡å·
å¤çSIGCHLDä¿¡å·å¹¶ä¸æ¯å¿
é¡»çãä½å¯¹äºæäºè¿ç¨ï¼ç¹å«æ¯æå¡å¨è¿ç¨å¾å¾å¨è¯·æ±å°æ¥æ¶çæåè¿ç¨å¤ç请æ±ãå¦æç¶è¿ç¨ä¸çå¾
åè¿ç¨ç»æï¼åè¿ç¨å°æ为åµå°¸è¿ç¨ï¼zombieï¼ä»èå ç¨ç³»ç»èµæºãå¦æç¶è¿ç¨çå¾
åè¿ç¨ç»æï¼å°å¢å ç¶è¿ç¨çè´æ
ï¼å½±åæå¡å¨è¿ç¨ç并åæ§è½ãå¨Linuxä¸å¯ä»¥ç®åå°å° SIGCHLDä¿¡å·çæä½è®¾ä¸ºSIG_IGNã
signal(SIGCHLD,SIG_IGN);
è¿æ ·ï¼å
æ ¸å¨åè¿ç¨ç»ææ¶ä¸ä¼äº§çåµå°¸è¿ç¨ã
温馨提示:答案为网友推荐,仅供参考