为什么要弄守护进程?
在Linux中,每个系统与用户交互的界面叫做终端。从终端运行的进程都会依附于这个终端,所有进程都是由终端进行管理,当关闭终端时所有依附于终端的进程都会被关闭。
守护进程就是要突破这种限制,
从开机运行,直到关机退出
。如果某个进程不想受到用户进程或终端控制,只需要把进程变为守护进程。
守护进程的编写步骤:
1. 创建子进程,父进程退出
让子进程变为后台进程,形式上就脱离了终端,子进程变为孤儿进程
if( fork() > 0)//关闭父进程
{
exit(0);
}
2. 在子进程中创建新会话,子进程变为会话组组长
#include <sys/types.h>
#include <unistd.h>
//设置当前进程为会话组组长
pid_t setsid(void);
3.修改子进程工作路径
#include <unistd.h>
int chdir(const char *path);
参数:
参数1:const char *path:修改的工作路径,既后面守护进程在什么地方进程后台运行
4. 在子进程中修改文件权限
#include <sys/types.h>
#include <sys/stat.h>
mode_t umask(mode_t mask);
参数:
参数1: mode_t mask:要设置的新的文件权限掩码 如:0002、0022、0000
5. 关闭父进程打开的文件描述符(如:标准输入、标准输出、标准错误)
#include <unistd.h>
int getdtablesize(void);//获取打开的文件描述符的最大值
例程:
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
pid_t pid = fork();//创建子进程
if(pid > 0) //关闭父进程,子进程变成孤儿进程
_exit(0);
pid = setsid();//会话id //知识点在进程基础概念里
int num = chdir("/home/ubuntu"); //守护进程后面运行的地方
if(num < 0 ) //创建失败
{
perror("error");
}
umask(0);
int fds = getdtablesize(); //关闭父进程的标准输入、标准输出、标准错误
for(int i = 0;i < fds;i++)
{
close(i);
}
int fd = open("ok.txt",O_WRONLY|O_CREAT,0777);//创建ok.txt文件权限777
while(1) //每隔1S往ok.txt文件里写hello world
{
write(fd,"hello world\n",12);
sleep(1);
}
}