-
先了解 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内的各个作业