特殊進程

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章