网站开发与设计教程,摄影网址,wordpress responsive,汉中免费做网站一、守护进程的概念
守护进程是脱离于终端控制#xff0c;且运行在后端的进程。#xff08;孤儿进程#xff09;守护进程不会将信息显示在任何终端上影响前端的操作#xff0c;也不会被终端产生的任何信息打断#xff0c;例如#xff08;ctrlc#xff09;.守护进程独立…一、守护进程的概念
守护进程是脱离于终端控制且运行在后端的进程。孤儿进程守护进程不会将信息显示在任何终端上影响前端的操作也不会被终端产生的任何信息打断例如ctrlc.守护进程独立于控制终端会周期性执行某个任务。运行在死循环中守护进程用于与操作系统启动相关的进程。大多数服务器都是用守护进程实现。
二、创建守护进程的流程
1.创建一个孤儿进程所有任务运行在孤儿进程中形式上脱离终端控制
让父进程结束运行而子进程继续运行
#include stdio.h
#include string.h
#include stdlib.h
#include unistd.h
#include sys/types.h
#include sys/stat.h
#include fcntl.h
#include dirent.h
#include errno.h
#include pthread.h
int main(int argc, const char *argv[])
{int resfork();if(res0){ //父进程exit(0);}else if(res0){ //子进程while(1);}else{exit(0);}return 0;
}2.新建会话:使子进程完全独立
setsid函数创建新的进程组创建新的会话组 pid_t setsid(void); 返回值 成功创建的会话组id sid 3.将当前进程对应的路径切换到根目录
chdir函数切换路径 int chdirconst char *path; 返回值 成功返回0 失败返回-1置位错误码 4.设置umask值 mode_t umask(mode_t mask); 功能设置掩码 参数 mask掩码的值 返回值总是会成功返回mask 5.进行文件描述重定向 int dupint oldfd 功能拷贝fd产生一个新的文件描述符nfd nfd产生的原则为最小未使用原则fd和nfd都可以操作同一个文件 文件fd和nfd共用同一个光标 参数 old旧的文件描述符 返回值 成功返回nfd失败返回-1置位错误 int dup2int oldfdint newfd 功能dup2函数相当于文件描述符的重定向 把newfd重定向到oldfd中以后向newfd写内容就是在向oldfd对应的文件中写内容 参数 oldfd旧文件描述符 newfd新文件描述符 返回值成功返回newfd失败返回-1置位错误码 实际使用其实是吧newfd重新定位为oldfd需要反过来 三、代码演示
#include stdio.h
#include string.h
#include stdlib.h
#include unistd.h
#include sys/types.h
#include sys/stat.h
#include fcntl.h
#include dirent.h
#include errno.h
#include pthread.h
int main(int argc, const char *argv[])
{int res fork();if(res 0 ){//1.创建孤儿进程//2.创建会话setsid();//3.切换到根目录chdir(/);//4.重设文件掩码:守护进程一般保留文件原有权限umask(0);//5.创建日志文件//getdtablesize:获取进程的最大的文件描述符for(int i3;igetdtablesize();i){close(i);//把之前开了的文件都关了}int fd;fdopen(my.log,O_RDWR|O_APPEND|O_CREAT,0666);if(fd-1){perror(open);}//6.文件描述符重定向dup2(fd,0);dup2(fd,1);dup2(fd,2);//7.开启自己的服务while(1){write(1,hello,6);putchar(10);sleep(1);}close(fd);}else if(res 0)//父进程{exit(0);}else{perror(fork);return -1;}return 0;
}运行结果