1、脱离控制终端tty,让父进程为init();
先处于游离状态,用init()控制,脱离方式:用fork()建立进程,把父进程关闭。
2、禁止进程重新打开控制终端
3、关闭打开的文件描述符。
文件描述符的大小在: cd /proc/sys/fs中,cat file-max得到最大文件描述符。然后for循环关闭。
4、改变当前的工作目录
进程活动时,其工作目录所在的文件系统不能卸下。一般需将工作目录更改为根目录chdir();
5、重设文件创建的掩码
umask(0000);
下面用代码来描述以上5步。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
int main(int argc, char *argv[])
{
int i;
int fd;
char *ptr="hello world";
//1.creat a child process
pid_t pid=fork();
//2.exit parent
if(pid<0)
exit(1);
else if(pid>0)
exit(0);
//set new session
setsid();
//3.close all fd
for(i=0;i<49265;i++)
{
close(i);
}
//4.chage dir
chdir("/");
//5.umask
umask(0);
while(1)
{
fd=open("/tmp/jia.log",O_CREAT|O_RDWR|O_APPEND,0666);
if(fd>0)
{
write(fd,ptr,strlen(ptr));
close(fd);
}
sleep(3);
}
return 0;
}
当执行可执行文件后,进程一直存在。但是系统关闭后,进程才消亡。
想要守护进程一直运行,可将可执行程序的路径添加到/etc/init.d下的rc文件中。