1. 程式人生 > >c++建立一個linux deamon程序

c++建立一個linux deamon程序

正規的方法, 建立一個deamon程序,需要很多步驟
1. fork()
2. 子程序setsid()
3. 主程序wait()
4. chdir()
5. umask()

非正規方法建立一個deamon程序的步驟:
1. 建立一個子程序fork(), 建立子程序的目的是為了後面的設定程序組ID.
2. 子程序執行setsid(), 執行setsid()有兩個目的, 一是建立一個新的會話,二是設定程序組ID.
3. 主程序wait()

每個函式都有他的意義.稍後再研究一下:

建立一個deamon程序

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h> #include <errno.h> int main(int argc, char *argv[]) { int n = fork(); pid_t pid; fprintf(stdout, "PID:%d, PGID:%d, SID:%d\n", getpid(), getpgrp(), getsid(0)); int stat = 0; if (n > 0) { pid_t x = wait(&stat
); printf("child pid=%d\n", x); if(WIFEXITED(stat) == 0) { printf("child normal exited!\n"); } } else if (n == 0) { if(setsid() < 0) { fprintf(stderr, "setsid error:%s\n", strerror(errno)); } while
(1) { printf("child.\n"); sleep(1); } } return 0; }

輸出:
這裡寫圖片描述
子程序退出後, 主程序仍然能正確啟動子程序的demo:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main(int argc, char *argv[])
{
    while(1) {
        int n = fork();
        pid_t pid;
        fprintf(stdout, "PID:%d, PGID:%d, SID:%d\n", getpid(), getpgrp(), getsid(0));

        int stat = 0;
        if (n > 0) {
            pid_t x = wait(&stat);
            printf("child pid=%d\n", x);
            if(WIFEXITED(stat) == 0) {
                printf("child normal exited!\n");
            }
        } else if (n == 0) {
            if(setsid() < 0) {
                fprintf(stderr, "setsid error:%s\n", strerror(errno));
            }

            while(1) {
                printf("child.\n");
                sleep(1);
            }
        }

        sleep(5);
    }

    return 0;
}

輸出:
這裡寫圖片描述
殭屍程序:
殭屍程序, 是指子程序先於父程序退出, 且退出時, 父程序沒有收到子程序的退出訊號.

#include <unistd.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
    int n = fork();
    pid_t pid;
    fprintf(stdout, "PID:%d, PGID:%d, SID:%d\n", getpid(), getpgrp(), getsid(0));

    if (n > 0) {
        while(1) {
            printf("parent.\n");
            sleep(1);
        }
    } else if (n == 0) {
            printf("child.\n");
    }

    return 0;
}

輸出:
這裡寫圖片描述