linux api daemon,后台运行进程

主流程:

  1. 调用fork()函数,创建一个子进程,然后使父进程退出,这样就能保证子进程不再有控制终端。

  2. 调用setsid()函数,创建一个新的会话期(session),并使当前进程成为该会话期的首进程和组长进程,这样就能摆脱之前的控制终端、会话期和进程组。

  3. 修改工作目录和文件权限掩码,确保守护进程不占用任何挂载的文件系统,并且对文件的访问权限受到适当的限制。

  4. 关闭标准输入、标准输出和标准错误文件描述符,以避免在后台运行时受到这些文件描述符的影响。

在Linux系统中,确实有一个名为daemon的函数。daemon函数是一个标准的Unix/Linux系统调用,用于将当前进程转变为守护进程。

daemon函数的原型如下:

#include <unistd.h> 
int daemon(int nochdir, int noclose); 

其中,nochdirnoclose是两个参数,用于控制守护进程的行为:

  • 如果nochdir设置为0,daemon函数会将当前工作目录切换到根目录(/);
  • 如果nochdir设置为非0,daemon函数会保持当前工作目录不变。
  • 如果noclose设置为0,daemon函数会关闭所有的已打开文件描述符(除了标准输入、标准输出和标准错误);
  • 如果noclose设置为非0,daemon函数不会关闭任何文件描述符。

daemon函数的返回值为0表示成功,返回-1表示失败。

使用daemon函数可以简化将进程转变为守护进程的过程。例如,下面的代码演示了如何使用daemon函数创建一个守护进程:

 

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main() {// 创建守护进程if (daemon(0, 0) == -1) {perror("daemon");return -1;}// 在守护进程中执行任务printf("This is a daemon process.\n");sleep(10);printf("Daemon process finished.\n");return 0;
}

上述代码中,调用daemon(0, 0)函数将当前进程转变为守护进程。在守护进程中,可以执行需要在后台运行的任务。在示例中,守护进程会打印一条消息,然后睡眠10秒,最后打印另一条消息。

需要注意的是,daemon函数仅适用于Unix/Linux系统,不适用于所有操作系统。在其他操作系统上实现守护进程可能需要使用不同的方法和函数。

源码是https://github.com/lattera/glibc/blob/master/misc/daemon.c

int
daemon (int nochdir, int noclose)
{int fd;switch (__fork()) {case -1:return (-1);case 0:break;default:_exit(0);}if (__setsid() == -1)return (-1);if (!nochdir)(void)__chdir("/");if (!noclose) {struct stat64 st;if ((fd = __open_nocancel(_PATH_DEVNULL, O_RDWR, 0)) != -1&& (__builtin_expect (__fxstat64 (_STAT_VER, fd, &st), 0)== 0)) {if (__builtin_expect (S_ISCHR (st.st_mode), 1) != 0
#if defined DEV_NULL_MAJOR && defined DEV_NULL_MINOR&& (st.st_rdev== makedev (DEV_NULL_MAJOR, DEV_NULL_MINOR))
#endif) {(void)__dup2(fd, STDIN_FILENO);(void)__dup2(fd, STDOUT_FILENO);(void)__dup2(fd, STDERR_FILENO);if (fd > 2)(void)__close (fd);} else {/* We must set an errno value since nofunction call actually failed.  */__close_nocancel_nostatus (fd);__set_errno (ENODEV);return -1;}} else {__close_nocancel_nostatus (fd);return -1;}}return (0);
}

nginx 的实现方式

ngx_int_t
ngx_daemon(ngx_log_t *log)
{int  fd;switch (fork()) {case -1:ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "fork() failed");return NGX_ERROR;case 0:break;default:exit(0);}ngx_parent = ngx_pid;ngx_pid = ngx_getpid();if (setsid() == -1) {ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "setsid() failed");return NGX_ERROR;}umask(0);fd = open("/dev/null", O_RDWR);if (fd == -1) {ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,"open(\"/dev/null\") failed");return NGX_ERROR;}if (dup2(fd, STDIN_FILENO) == -1) {ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDIN) failed");return NGX_ERROR;}if (dup2(fd, STDOUT_FILENO) == -1) {ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDOUT) failed");return NGX_ERROR;}#if 0if (dup2(fd, STDERR_FILENO) == -1) {ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDERR) failed");return NGX_ERROR;}
#endifif (fd > STDERR_FILENO) {if (close(fd) == -1) {ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "close() failed");return NGX_ERROR;}}return NGX_OK;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/199243.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决typescript报错:找不到名称xxx

现象&#xff1a; 原因&#xff1a;在同时导入默认导出和命名导出时&#xff0c;默认导出必须放在命名导出之前 下面的就是原始文件&#xff1a; 默认导出指&#xff1a; export default导出类型&#xff0c; import时无需大括号 命名导出指&#xff1a; 仅有export关键字…

优化汽车产业用户营运:精细化策略

近年来随着互联网时代新技术浪潮的冲击&#xff0c;商业社会中各种原生边界不断被打破&#xff0c;新的消费需求、新的商业模式、新的竞争挑战层出不穷。各行业往往面临重重困境与迷思&#xff0c;学会如何精细化运营用户显得尤为重要。立即阅读阅文&#xff0c;详细了解其中用…

java中一个空的Object对象在HotSpot虚拟机中占用多大的内存空间?

在HotSpot虚拟机中&#xff0c;一个空的Object对象在64位的环境下通常占用约 16 字节的对象头。 这个对象头包括&#xff1a; 标记字&#xff08;Mark Word&#xff09;&#xff1a; 8 字节&#xff0c;用于存储对象的状态信息、锁信息等。类型指针&#xff08;Class Pointer&…

手动创建spring bean并注入

文章目录 前言一、jar包中,相同class不同类加载器加载的时候是同一个class嘛&#xff1f;二、利用ConfigurableListableBeanFactory手动注册bean注册bean,并自动注入依赖bean根据类型获取注入的bean,两个bean是一个吗? 三、同一份字节码,class隔离,bean隔离总结 前言 注入一个…

【Python百宝箱】Python引领虚拟奇境:探索VR和AR开发的利器库

穿越数字之门&#xff1a;Python库助您打造虚拟现实与增强现实未来 前言 虚拟现实&#xff08;VR&#xff09;和增强现实&#xff08;AR&#xff09;技术正在迅速崛起&#xff0c;为我们的数字体验提供了全新的可能性。在这个充满创新的领域中&#xff0c;选择合适的工具和库…

python打包exe,打包好后,启动exe报错找不到paddleocr

目录 1、安装pyinstaller 2、生成脚本文件的.spce文件 3、资源文件配置 4、生成exe文件 5、使用了paddleocr启动exe后报错 6、配置.spce文件 7、重新生成exe文件 8、关于图片找不到的问题 参考&#xff1a;PaddleOCR打包exe--Pyinstaller_paddleocr 打包exe_mjiansun的博…

JS初步了解this

什么是环境对象&#xff1f; 环境对象&#xff1a;指的是函数内部特殊的变量this&#xff0c;它代表着当前函数运行时所处的环境 作用&#xff1a;弄清楚this的指向&#xff0c;可以让我们代码更简洁 在普通函数中&#xff1a; // 每个函数里面都有this 普通函数的this指向wind…

面试多线程八股文十问十答第三期

面试多线程八股文十问十答第三期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1.介绍一下自旋锁 重量级锁竞争时&#xff0c;尝试获取锁的线程不会立即阻塞&…

高效合并技巧:视频合并,保证质量,提升剪辑效率

在视频制作过程中&#xff0c;视频剪辑和合并是常见的操作步骤。不过这些步骤往往需要耗费大量的时间和精力。那要如何提高效率呢&#xff1f;下面讲解一些高效合并技巧&#xff0c;引用云炫AI智剪快速整合视频&#xff0c;随机合并视频&#xff0c;保证质量&#xff0c;并提升…

【Linux--进程】

目录 一、基本概念1.1描述进程-PCB1.2task_struct中内容分类 二、了解进程2.1查看进程2.2通过系统调用获取进程标识符 三、fork创建进程3.1fork()函数3.2写时拷贝 四、进程的状态4.1操作系统学科里的进程状态&#xff08;运行、阻塞、挂起&#xff09;4.具体的Linux状态是如何维…

xampp环境安装

XAMPP是完全免费且易于安装的Apache发行版&#xff0c;其中包含Apache、MariaDB、PHP和Perl。 类似XAMPP的服务器套件还有很多&#xff0c;我用过的还有UPUPW&#xff0c;它们都极大的简化了开发环境的配置。 下载链接Download XAMPP 我选的最新的 一路next就安装好了。 访问…

百度曾出价 8500 万挖“AI 教父”被拒;GPT-3.5 图灵测试中败给上世纪 AI丨 RTE 开发者日报 Vol.99

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

创建 Python Docker 镜像的完整指南

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Python和Docker是两个极其流行的技术&#xff0c;结合它们可以创建强大的应用程序。Docker允许将应用程序及其依赖项打包到一个独立的容器中&#xff0c;而Python则提供了丰富的库和工具来开发应用程序。本文将提…

2023年12月5日作业:多态

题目&#xff1a; 代码&#xff1a; #include <iostream>using namespace std;class Animals { private:string name; public:Animals(){}Animals(string name):name(name){}virtual void perform() 0;void show(){cout << "这个动物是" << name…

使用肘部法则选择KMeans聚类中的k值

在这篇文章中&#xff0c;我们将讨论如何选择最好的k&#xff08;聚类数&#xff09;的k-Means聚类算法。 肘部法则简介 任何无监督算法的基本步骤是确定数据可以被聚类到的聚类的最佳数量。因为我们在无监督学习中没有任何预定义数量的聚类。我们倾向于使用一些可以帮助我们…

通过断点调试解决node 运行js程序直接退出(没有任何报错提示)的问题

现象&#xff1a; node运行程序直接退出&#xff0c;但是从echo $?的返回值可以知道&#xff1a; 一定出现了错误&#xff0c;但是没有显示出来 解决办法&#xff1a; 1. 使用node --inspect-brk 启动程序 然后在浏览器访问chrome://inspect 然后点击inspect 进行单步调试 …

go语言项目的目录结构

Golang 的项目目录结构并没有一个强制的标准&#xff0c;但社区中形成了一些共识和最佳实践&#xff0c;以便更好地组织和管理代码。以下是一个典型的 Golang 项目目录结构示例&#xff1a; /myproject ├── /cmd | ├── /app | | └── main.go | …

APB Introduction

• APB: Advanced Peripheral Bus ( 高级外设总线 ) • 应用场景:提供了一个低功耗接口,降低接口复杂性。 • 特性: • 可工作在高频下 • 协议简单:无复杂的时序 • 控制逻辑简单 • 同步总线:总线上所有的 transaction (读

你有哪些工作提效的工具或方法?

RPA专门解决一些高度重复、具有规则性的流程任务&#xff0c;这样的任务&#xff0c;在我们的职场上可谓多得数不胜数 RPA的使用&#xff0c;也不难&#xff0c;把握RPA使用三部曲 第一步&#xff1a;确定目标流程 首先需要确定要实现自动化的业务流程。这就包括了分析当前的…

汽车标定技术(十一)--XCP应用场景分析

目录 1.模型在环场景 2.软件在环场景 3.硬件在环场景 4.Bypassing分析 5.软件Debug over XCP