-
先了解 linux系統中 會話的概念
會話是進程組的更高一級,多個進程組對應一個會話。
會話是一個或多個進程組的集合
創建一個會話需要注意以下5點事項:
a. 調用進程不能是進程組組長, 該進程變成新會話首進程(session header)
b. 該進程成為一個新進程組的組長進程。
c. 新會話丟棄原有的控制終端,該會話沒有控制終端
d. 該調用進程是組長進程, 則出錯返回
e. 建立新會話,先調用fork,父進程終止,子進程調用setsid -
守護進程
Daemon(精靈)進程,是Linux后臺服務進程。獨立于控制終端,一般采用以d結尾的名字
創建守護進程,最關鍵的一步是調用setid函數創建一個新的session,并成為Session Leaders。
創建守護進程步驟:
代碼案例:
創建一個守護進程,每隔一定時間,創建一個文件
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <time.h>
#include <signal.h>
#include <sys/time.h>#define _FILE_NAME_FORMAT "%s/temp1/mydaemon.%ld"
void catch(int sigNum) {char *homePath = getenv("HOME");char strFileName[128] = {'\0'};sprintf(strFileName, _FILE_NAME_FORMAT, homePath, time(NULL));int fd = open(strFileName, O_RDWR|O_CREAT, 0666);printf("filename is %s\n", strFileName);if(fd < 0) {perror("open file error\n");}close(fd);
}int main() {pid_t pid = fork();if(pid > 0) {exit(0);}printf("pid is %d\n", getpid());pid_t spid = setsid();umask(0);chdir(getenv("HOME"));printf("spid is %d\n", spid);struct sigaction myact;myact.sa_flags = 0;sigemptyset(&myact.sa_mask);myact.sa_handler = catch;sigaction(SIGALRM, &myact, NULL);struct itimerval itv = {{5,0},{3,0}};setitimer(ITIMER_REAL, &itv, NULL);while (1) {sleep(1);}return 0;
}
ps:關于 umask的使用, 設置為 0, 而創建文件的守護,用的是 0666,
那么對應的 就是0666 - 0000,權限為 rw-rw-rw-,
如果umask,設置為2, 對應的就是 0666 - 0002,權限為rw-rw-r–
使用 nohup 命令,可以簡單的創建后臺進程
nohup ./a.out &
&表示后臺運行, 這個命令能屏蔽SIGHUP命令
‘>>’ 可以將輸出重定向
nohup命令 ,
本信號在用戶終端連接(正常或非正常)結束時發出, 通常是在終端的控制進程結束時, 通知同一session內的各個作業