前言
会话是用来管理前后台进程组,会话关联着一个终端,当我们关闭终端之后,会话也会随之被关闭,那么进程组里面管理的进程也会随之被关闭。
举例说明:当你用终端启动一个进程后,关闭终端,那么你运行的命令那个线程也会被关闭
我们不想我们启动的线程受到终端的影响,就算终端被关闭,也可以在后台运行,我们可以用创建守护进程的方法做到。
创建守护进程
1.创建一个子进程,父进程直接退出
方法:通过fork()函数
2.创建一个新会话,摆脱终端的影响
方法:通过setsid()函数
3.改变守护进程的当前工作目录,改为'/'
方法:通过chdir()函数
4.重设文件权限掩码
方法:通过umask()函数
5.关闭不需要的文件描述符
0,1,2 分别对应标准输入、标准输出、标准错误,默认被打开。我们并不希望守护进程和终端有任何关联,所以要关掉。
方法:调用close()函数
代码如下
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<fcntl.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/stat.h>
#define maxfile 3
int main()
{
pid_t pid;
int fd,len,i,num,times = 100;
char *buf = "this is dameon\n";
len = strlen(buf) + 1;
/*1.创建子进程,销毁父进程*/
pid = fork();
if(pid < 0)
{
printf("fork is failed\n");
exit(1);
}
if(pid > 0)
{
exit(0);
}
/*2.创建新会话,摆脱终端的影响 */
setsid();
/*3.改变当前工作目录*/
chdir("/");
/*4.重设文件权限掩码*/
umask(0);
/*5.关闭默认文件描述符*/
for(i = 0; i<maxfile;i++)
{
close(i);
}
/*6.实现守护进程的功能*/
while(times)
{
fd = open("/tang.txt",O_CREAT| O_WRONLY |O_APPEND ,0666);
write(fd,buf,len);
close(fd);
sleep(10);
times = times -10;
}
}
可以使用以下命令查看特定的任务状态
ps axjf | grep "lalala"
其中 lalala
为进程名称
nohub命令
将普通进程伪装成守护进程,用法简单:
命令:nohub kkk para
kkk :为进程名称
para :为进程输入的参数