守护进程是一种长期运行的进程,这种进程在后台运行,不跟任何控制终端关联
一般跟随操作系统启动,生存期长(一般)
守护进程跟黑窗口无关联
./这种命令在后台运行的概念,不会站着终端,
PPID为0,都是内核进程,跟随系统启动,贯穿整个系统
cmd 列[]都是内核守护进程;
init:也是系统守护进程,负责启动各运行层次特定的系统服务,也负责收养孤儿进程
cmd列中,不带[],都是普通守护进程,系统日志,往往自成一组
守护进程编写规则
umask是一个函数,用来屏蔽一些权限
fork()一个子进程,父进程退出,固定套路
fork()目的是成功调用setsid()来建立新会话,不是进程组组长才可以
子进程有单独的sid;而且子进程也成为一个新的进程组组长,不关联任何终端了
主函数中。
int main(){
if(ngx_daemon()!=1)//入口函数
return 1;//失败
else
{
for(;;)
{
sleep(1);
printf("进程Id 是 %d \n",getpid());//打印了也看不见
}
}
}
线程函数。
int ngx_daemon()
{
int fd;
switch (fork())//线程创建
{
case -1:
return -1;//失败
case 0:
//子线程走到这里,可以直接跳出
break;
default:
exit(0);
//父进程直接退出
}
if(setsid()==-1)//创建子进程,失败都是-1
return -1;
umask(0);//设置为0,不要设置文件权限
fd=open("/dev/null",O_RDWR);//打开空设备
//只有子进程流程才能走到这里
if(fd==-1)
return -1;
if(dup2(fd,STDIN_FILENO)==-1)//文件描述符,把标准输入从屏幕断开
return -1;//标准错误是2
if(dup2(fd,STDOUT_FILENO)==-1)//----1
return -1;
if(fd>STDERR_FILENO)
return -1;
return 1;
}