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