1、孤兒進程(子進程沒有結束,父進程結束了,子進程就成了孤兒,被init進程收養)
2、殭屍進程(進程結束後,操作系統會保留其退出狀態,進程號等信息,並放回給其父進程。父進程通過調用wait函數獲取或忽略這些信息,並銷燬這些信息,如果父進程不處理,就長生了殭屍進程,直到被init收養釋放)
根本原因:子進程死了,父進程不管不問。
程序已經結束,但相關數據任駐留在內存(pid被佔卻沒有使用,資源浪費)。
避免殭屍進程:
wait或waitpid : 會導致父進程阻塞
進程死後會自動給父進程發SIGCHLD信號,父進程對這個信號進行處理,或直接忽略。
3、 守護進程:脫離終端在後臺獨立運行(後綴爲d)
創建守護進程的步驟:
1. 創建子進程,父進程結束,所有任務在子進程中進行。:擺脫父親的控制
2. 設置新的回話(setsid): 擺脫終端的控制
3. 設置當前目錄爲根目錄(chdir) :擺脫的更徹底,不要終端的東西(設置)
4. 重設文件權限掩碼(umask):自行設置
5. 關閉不需要的文件描述符號 :重新開始
無法調用標準輸入,標準輸出等 :無法享用有父母的福利
只能通過文件操作
殭屍進程及處理方法:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
void hander(int sig)//法一:自定義處理函數
{
;
}
int main()
{
signal(SIGCHLD,SIG_IGN);//法二:忽略
int i;
pid_t pid;
for(i=0;i<100;i++)
{
pid=fork();
if(pid<0)
{
printf("fork()");
exit(0);
}
if(pid==0)
break;
}
if(pid==0)
exit(0);
// signal(SIGCHLD,SIG_IGN);放在這裏殭屍還會出現
// signal(SIGCHLD,hander);
sleep(60);
return 0;
}
守護進程代碼
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
pid_t pid;
pid=fork();
if(pid <0)
{
perror("fork");
exit(-1);
}
if(pid>0)
exit(0);
setsid();
chdir("/");
umask(0);
int i;
for(i=0;i<65535;i++)
close(i);
sleep(10);
//重生,該幹嘛幹嘛
/* while(1)
{
}
*/
return 0;
}