2026/2/13 12:43:55
网站建设
项目流程
有哪些是做二手的网站,网站降权该怎么做,推广普通话的广告语,湖南做旅游网站哪家最好在Linux中#xff0c;要使进程完全脱离父进程控制#xff0c;通常需要使用以下系统调用组合#xff1a;
1. setsid() - 创建新会话
这是最关键的一步#xff0c;它会#xff1a;
创建一个新的会话使调用进程成为会话首进程使调用进程成为新进程组的组长使调用进程脱离控…在Linux中要使进程完全脱离父进程控制通常需要使用以下系统调用组合1.setsid() - 创建新会话这是最关键的一步它会创建一个新的会话使调用进程成为会话首进程使调用进程成为新进程组的组长使调用进程脱离控制终端#includeunistd.h#includestdio.hintmain(){pid_tpidfork();if(pid0){perror(fork failed);return1;}// 父进程退出if(pid0){_exit(0);}// 子进程创建新会话if(setsid()0){perror(setsid failed);return1;}// 此时进程已脱离原会话和控制终端// 继续执行守护进程逻辑...return0;}2.setpgid() - 设置进程组ID用于更精确地控制进程组关系#includeunistd.h#includestdio.hintmain(){pid_tpidfork();if(pid0){perror(fork failed);return1;}if(pid0){// 子进程// 将自己放入新的进程组通常与setsid配合if(setpgid(0,0)0){perror(setpgid failed);return1;}// 然后创建新会话if(setsid()0){perror(setsid failed);return1;}}else{// 父进程// 父进程可以等待子进程设置完成sleep(1);// 父进程退出子进程被init进程接管}return0;}3.完整的守护进程实现#includeunistd.h#includesys/stat.h#includestdio.h#includestdlib.h#includefcntl.hvoiddaemonize(){pid_tpid;// 1. 创建子进程父进程退出pidfork();if(pid0){perror(fork);exit(EXIT_FAILURE);}if(pid0){// 父进程exit(EXIT_SUCCESS);}// 2. 创建新会话脱离控制终端if(setsid()0){perror(setsid);exit(EXIT_FAILURE);}// 3. 改变工作目录到根目录if(chdir(/)0){perror(chdir);exit(EXIT_FAILURE);}// 4. 重设文件权限掩码umask(0);// 5. 关闭所有文件描述符for(inti0;isysconf(_SC_OPEN_MAX);i){close(i);}// 6. 重定向标准输入输出到/dev/nullintfdopen(/dev/null,O_RDWR);if(fd!-1){dup2(fd,STDIN_FILENO);dup2(fd,STDOUT_FILENO);dup2(fd,STDERR_FILENO);if(fd2){close(fd);}}}intmain(){daemonize();// 守护进程的主要逻辑while(1){// 执行任务sleep(10);}return0;}4.使用 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.target5.关键区别系统调用作用效果setsid()创建新会话进程成为会话首进程脱离控制终端setpgid(pid, pgid)设置进程组将指定进程放入指定进程组fork()setsid()标准守护进程完全脱离父进程控制6.注意事项双重fork技巧某些情况下需要双重fork确保进程不会成为会话首进程信号处理重新设置信号处理器特别是SIGHUP资源清理关闭不需要的文件描述符工作目录更改到安全目录防止占用文件系统日志记录使用syslog或其他日志机制这样设置的进程将完全独立于原始父进程即使父进程退出也不会影响它并由init/systemd进程接管。