核心内容摘要
【小程序毕设源码分享】基于springboot+小程序的爱抚宠物小程序的设计与实现(程序+文档+代码讲解+一条龙定制)
在Linux中要使进程完全脱离父进程控制通常需要使用以下系统调用组合
setsid() - 创建新会话这是最关键的一步它会创建一个新的会话使调用进程成为会话首进程使调用进程成为新进程组的组长使调用进程脱离控制终端#includeunistd.h#includestdio.hintmain(){pid_tpidfork();if(pid
{perror(fork failed);return1;}// 父进程退出if(pid
{_exit(
;}// 子进程创建新会话if(setsid()
{perror(setsid failed);return1;}// 此时进程已脱离原会话和控制终端// 继续执行守护进程逻辑...return0;}
setpgid() - 设置进程组ID用于更精确地控制进程组关系#includeunistd.h#includestdio.hintmain(){pid_tpidfork();if(pid
{perror(fork failed);return1;}if(pid
{// 子进程// 将自己放入新的进程组通常与setsid配合if(setpgid(0,
0)
{perror(setpgid failed);return1;}// 然后创建新会话if(setsid()
{perror(setsid failed);return1;}}else{// 父进程// 父进程可以等待子进程设置完成sleep(
;// 父进程退出子进程被init进程接管}return0;}
完整的守护进程实现#includeunistd.h#includesys/stat.h#includestdio.h#includestdlib.h#includefcntl.hvoiddaemonize(){pid_tpid;//
创建子进程父进程退出pidfork();if(pid
{perror(fork);exit(EXIT_FAILURE);}if(pid
{// 父进程exit(EXIT_SUCCESS);}//
创建新会话脱离控制终端if(setsid()
{perror(setsid);exit(EXIT_FAILURE);}//
改变工作目录到根目录if(chdir(/)
{perror(chdir);exit(EXIT_FAILURE);}//
重设文件权限掩码umask(
;//
关闭所有文件描述符for(inti0;isysconf(_SC_OPEN_MAX);i){close(i);}//
重定向标准输入输出到/dev/nullintfdopen(/dev/null,O_RDWR);if(fd!-
{dup2(fd,STDIN_FILENO);dup2(fd,STDOUT_FILENO);dup2(fd,STDERR_FILENO);if(fd
{close(fd);}}}intmain(){daemonize();// 守护进程的主要逻辑while(
{// 执行任务sleep(
;}return0;}
使用 systemd 服务的现代方法对于现代Linux系统推荐使用systemd服务# /etc/systemd/system/my-service.service [Unit] DescriptionMy Daemon Service Afternetwork.target [Service] Typeforking PIDFile/var/run/my-service.pid ExecStart/usr/local/bin/my-daemon Restartalways Usernobody Groupnogroup # 确保进程完全独立 NoNewPrivilegesyes PrivateTmpyes ProtectSystemstrict ProtectHometrue PrivateDevicesyes [Install] WantedBymulti-user.target
关键区别系统调用作用效果setsid()创建新会话进程成为会话首进程脱离控制终端setpgid(pid, pgid)设置进程组将指定进程放入指定进程组fork()setsid()标准守护进程完全脱离父进程控制
6.