c++建立一個linux deamon程序
阿新 • • 發佈:2019-02-12
正規的方法, 建立一個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;
}
輸出: