程序人生 | Linux Daemon 程序设计示例

用lazarus开发Linux daemon程序及编写启动脚步 用lazarus开发Linuxdaemon程序及编写启动脚步   Linux Daemon程序简介 Linux Daemon程序(守护进程或精灵进程)是生存期较长的一种进程。它们常常在系统自举时启动,仅当系统关闭时才终止。所以它们没有控制终端,在后台运行。 在Linux C环境下编写daemon程序,需要遵循一些基本规则,以便防止产生并不需要的交互作用。比如其中有两条重要的规则。 第一, 阅读详情

本文首发于 2014-08-08 17:55:32

概念

daemon 程序,又称为守护进程,通常在系统后台长时间运行,由于没有控制终端而无法与前台交互。daemon程序一般作为系统服务使用,Linux系统中运行着很多这样的守护进程,如 iptables,nfs,ypbind,dhcpd 等。

daemon 程序设计步骤

  1. 程序运行后调用fork,并让父进程退出。子进程获得一个新的进程ID,但继承了父进程的进程组ID。
  2. 调用setsid创建一个新的session,使自己成为新session和新进程组的leader,并使进程没有控制终端(tty)。
  3. 设置文件创建mask为0,避免创建文件时权限的影响。
  4. 关闭不需要的打开文件描述符。因为 daemon 程序在后台执行,不需要于终端交互,通常就关闭STDIN、STDOUT和STDERR。其它根据实际情况处理。
  5. daemon 无法输出信息,可以使用SYSLOG或自己的日志系统进行日志处理。(可选)
  6. 编写管理 daemon 的SHELL脚本,使用service对 daemon 进行管理和监控。(可选)

示例

daemon 程序源码

//这里使用自己的日志系统,当然也可以使用SYSLOG。
#define LOGBUFSZ 256     /*log buffer size*/
#define LOGFILE  "/var/log/wsiod.log"  /*log filename*/
int wsio_logit(char * func, char *msg, ...)
{
        va_list args;
        char prtbuf[LOGBUFSZ];
        int save_errno;
        struct tm *tm;
        time_t current_time;
        int fd_log;

        save_errno = errno;
        va_start (args, msg);
        (void) time (¤t_time);            /* Get current time */
        tm = localtime (¤t_time);
        sprintf (prtbuf, "%02d/%02d %02d:%02d:%02d %s ", tm->tm_mon+1,
                    tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, func);
        vsprintf (prtbuf+strlen(prtbuf), msg, args);
        va_end (args);
        fd_log = open (LOGFILE, O_WRONLY | O_CREAT | O_APPEND, 0664);
        write (fd_log, prtbuf, strlen(prtbuf));
        close (fd_log);
        errno = save_errno;
        return 0;
}

int init_daemon(void)
{
  pid_t pid;
  int i;

  /* parent exits , child continues */
  if((pid = fork()) < 0)
    return -1;
  else if(pid != 0)
    exit(0);

  setsid(); /* become session leader */

  for(i=0;i<= 2;++i) /* close STDOUT, STDIN, STDERR, */
    close(i);

  umask(0); /* clear file mode creation mask */
  return 0;
}

void sig_term(int signo)
{
  if(signo == SIGTERM)  /* catched signal sent by kill(1) command */
  {
     wsio_logit("", "wsiod stopped/n");
     exit(0);
 }
}

/* main program of daemon */
int main(void)
{
if(init_daemon() == -1){
printf("can't fork self/n");
exit(0);
  }
  wsio_logit("", "wsiod started/n");
  signal(SIGTERM, sig_term); /* arrange to catch the signal */

  while (1) {
    // Do what you want here
    … …
  }
  exit(0);
}

daemon 程序管理脚本

daemon 程序可以使用 service 工具进行管理,包括启动、停止、查看状态等,但前题是需要编写一个如下的简单SHELL脚本,比如 /etc/init.d/wsiod :

#!/bin/sh
#
# wsiod         This shell script takes care of starting and stopping wsiod.
#
# chkconfig: 35 65 35
# description: wsiod is web servce I/O server, which is used to access files on remote hosts.

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

RETVAL=0
prog="wsiod"
WSIOARGS="-h $HOSTNAME -p 80 -t STANDALONE -k -c -d"
start() {
        # Start daemons.
        echo -n $"Starting $prog: "
        daemon /usr/local/bin/wsiod ${WSIOARGS}
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/wsiod
        return $RETVAL
}
stop() {
        # Stop daemons.
        echo -n $"Shutting down $prog: "
        killproc wsiod
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/wsiod
        return $RETVAL
}

# See how we were called.
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart|reload)
        stop
        start
        RETVAL=$?
        ;;
  status)
        status wsiod
        RETVAL=$?
        ;;
  *)
        echo $"Usage: $0 {start|stop|restart|status}"
        exit 1
esac

exit $RETVAL

daemon 程序指令

由上述脚本可知,该 daemon 程序支持的指令有 start|stop|restart|reload|status ,以启动 daemon 程序为例,指令为:

/etc/init.d/wsiod start

欢迎关注我的微信公众号【数据库内核】:分享主流开源数据库和存储引擎相关技术。

标题网址
GitHubhttps://dbkernel.github.io
知乎https://www.zhihu.com/people/…
思否(SegmentFault)https://segmentfault.com/u/db…
掘金https://juejin.im/user/5e9d3e…
开源中国(oschina)https://my.oschina.net/dbkernel
博客园(cnblogs)https://www.cnblogs.com/dbkernel
daemon deamon生命周期很长。在后台运行并且不拥有控制终端。deamon用来指向特殊任务,如:cron:一个在规定时间执行命令的daemon。sshd:安全shell deamon,允许在远程主机上使用一个安全的通信协议登录系统。httpd:HTTP服务器daemon,用于Web页面。inetd:Internet超级服务器daemon,监听从指定的TCP/IP端口上进入的网络连接并启动相应的服务器程序来处理这些连接。通常将daemon程序的名称以字母d结尾。 阅读详情

相关推荐

GD32官方资料学习体系(主要包括MCU选型、原理图PCB设计、软件开发入门及用户手册等)

大部分还未更新,先占个坑,日后更新…… 目前国外芯片涨价涨的离谱(就是在说ST),国内最好的替代就是兆易创新出的系列芯片了。但是官方资料繁杂,小白上手不易,因此边入门边记录,也给后来者根据官方资料可以有一个较为完整的学习体系。

Eddie的博客 1万+

Linux C编程:守护进程(Daemon进程)

1.特点: 1》生成时间较长:系统启动开始运行,系统关闭时结束; 2》通常独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件; 3.终端: 在linux中,每一个系统与用户进行交流的界面称为终端。 每一个次从终端开始进行的进程都会依附于这终端,这个终端就称为这些进程的控制终端,当终端被关闭时,相应的进程都会被自动关闭; 3.守护进程的实现: (1).进程第1次fork,为进程调用setsid做准备; ...

I_feige的博客 2780

Win11下CH340串口识别失败的终极排查指南:从驱动更新到硬件电路检查

本文提供了Windows 11系统下CH340串口芯片识别失败的全面排查指南。从驱动更新、系统设置等软件层面入手,逐步深入到USB线缆、电源测量等硬件连接检查,并重点剖析了硬件设计细节,如电源退耦电容容值对设备描述符请求的关键影响,最终帮助开发者系统性地定位并解决识别难题。

weixin_29174013的博客 593

linux Daemon程序设计(含步骤、源码、管理)

什么事D Daemon程序,又称为守护进程,通常在系统后台长时间运行,由于没有控制终端而无法与前台交互。Daemon程序一般作为系统服务使用,Linux系统中运行着很多这样的守护进程,如iptables,nfs,ypbind,dhcpd等。 Daemon设计原则

竹林听雨 2319

从原理到代码:拆解UniFormer中动态位置嵌入(DPE)的3D卷积实现

本文深入解析了UniFormer模型中动态位置嵌入(DPE)模块的3D卷积实现原理与代码。DPE通过一个轻量的3D深度可分离卷积,替代传统静态位置编码,使模型能自动学习视频数据的时空位置关系。文章对比了其与Swin Transformer相对位置偏置的优劣,并提供了PyTorch实现代码与高级定制方案,为视频理解任务提供了高效灵活的动态位置编码解决方案。

weixin_29207149的博客 310

AD936x Evaluation Software 实战配置指南:从寄存器设置到滤波器优化

本文提供AD936x Evaluation Software的实战配置指南,详细解析从工程创建、RF向导与时钟模块配置,到数字滤波器优化、数字接口设置及增益控制的完整流程。重点分享寄存器设置、滤波器系数权衡及PLL稳定技巧等核心要点,帮助开发者高效配置AD9361/AD9363射频芯片,快速应用于SDR、基站等场景。

perl8的博客 698

【linux C】daemon函数应用之——进程守护小工具,运维仔看了都说好!并附带shell版本

最近接触到Linux C中的daemon函数,顾名思义,它和守护进程Daemon有关;简单来说Linux Daemon(守护进程)是运行在后台的一种特殊进程;一般来说,它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件,因为守护进程是在后台运行,不会占着终端,所以终端可以执行其他命令。Linux系统的大多数服务器就是通过守护进程实现的。常见的守护进程包括系统日志进程syslogd、 web服务器httpd、邮件服务器sendmail和数据库服务器mysqld等。

Rio小哥的博客 1418

从STM32转战华大HC32F4A0:我的踩坑实录与10个USART的灵活配置心得

本文分享了从STM32迁移至华大HC32F4A0的实战经验,重点解析了10个USART的灵活配置技巧及常见问题解决方案。通过对比STM32F407,详细介绍了HC32F4A0在外设灵活性、IO功能组设计及多串口应用中的优势,帮助开发者快速掌握国产芯片的开发要点。

weixin_30514745的博客 525

linux环境下使用daemon函数实现守护进程

daemon进程是后台守护进程,比如linux 下server都是daemon进程,像httpd、sshd等这些服务你肯定听说过,如果我们想写一个后台运行程序应该怎么做呢?其实非常容易,只要添加unistd.h头文件,然后在调用daemon函数即可...

AlbertS Home of Technology 2962

Keras中神经网络可视化模块keras.utils.visualize_util安装配置方法

Keras中神经网络可视化模块keras.utils.visualize_util安装配置方法

jacke121的专栏 2759

ISO21434 组织网络安全管理(二)

为了实现网络安全工程,该组织建立并维护网络安全治理和网络安全文化,包括网络安全意识管理、能力管理和持续改进。这涉及到指定针对本文档的目标进行独立审计的特定于组织的规则和过程。 为了支持网络安全工程,该组织实施了网络安全的管理系统,包括管理工具和应用质量管理系统。

qq_42357877的博客 1322

Linux守护进程(daemon)

Linux守护进程实例。

YIVIES 2929

【YOLO11改进 - C3k2融合】C3k2融合DWRSeg二次创新C3k2_DWR:扩张式残差分割网络,提高特征提取效率和多尺度信息获取能力,助力小目标检测

【YOLO11改进 - C3k2融合】C3k2DWRSeg二次创新C3k2_DWR:扩张式残差分割网络,提高特征提取效率和多尺度信息获取能力,助力小目标检测

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 1058

LINUX Daemon程序设计

liuben liuben 2 49 2006-11-02T07:02:00Z 2006-11-02T07:02:00Z 5 550 3138 cc-ihep 26 6 3853 9.2812 7.8 磅 0 2

刘爱贵的专栏 9111

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

linux daemon步骤,编写Linux系统下Daemon程序的方法步骤

编写Linux系统下Daemon程序的方法步骤一、引言 Daemon程序是一直运行的服务端程序,又称为守护进程。本文介绍了在Linux下编写Daemon程序的步骤,并给出了例子程序。二、Daemon程序简介 Daemon是长时间运行的进程,通常在系统启动后就运行,在系统关闭时才结束。一般说Daemon程序在后台运行,是因为它没有控制终端,无法和前台的用户交互。Daemon程序一般都作为服务程序使用...

weixin_28958239的博客 1284

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

linux daemon java_创建 SysV 风格的 linux daemon 程序

本文介绍如何使用 C 语言创建 Linux 系统中 SysV 风格的 daemon 程序。注意:这是一种旧式的 daemon 程序写法,进入 systemd 时代后是不需要通过这样的方式创建 daemon 程序的。 本文的演示环境为 ubuntu 18.04。创建 daemon 程序的流程通过前文《Linux session(会话)》我们了解到,如果要让程序运行在后台,必须处理好进程的 sessi...

weixin_39960116的博客 137

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

linux c daemon 程序后台运行函数

linux提供了 daemon()函数主要用于希望脱离控制台,以守护进程形式在后台运行的程序 原型: #include <unistd.h> int daemon(int nochdir, int noclose); 参数: 当nochdir为0时,daemon将更改进城的根目录为root(“/”)。 当noclose为0是,daemon将进城的STDIN, STDOU...

whatday的专栏 4844

linux下编写daemon程序步骤

一、引言 Daemon程序是一直运行的服务端程序,又称为守护进程。 本文介绍了在Linux下编写Daemon程序的步骤,并给出了例子程序。 二、Daemon程序简介 Daemon是长时间运行的进程,通常在系统启动后就运行,在系统关闭时才结束。一般说Daemon程序在后台运行,

风之谷 1236

linux daemon简介

一、什么是daemon?我们先来简单介绍下什么是服务(service)。Linux系统可以提供很多系统或网络功能(例如http,ftp,mysql等),提供这些功能当然需要运行一些程序,这些运行的程序我们称为进程,也就是说系统中运行的进程提供了功能,这些进程就是服务。例如:提供了http功能的进程就是http服务。 服务可以说是某一进程,而进程是需要程序去运行产生,也就是说程序运行提供某种服务,这些

Lvnux的专栏 1万+

daemon函数使程序后台运行

daemon函数的作用就是让程序从控制终端分离开,以后台进程方式运行,服务器程序都是这么运行的。 查看一下man手册 NAME daemon - run in the background SYNOPSIS #include <unistd.h> int daemon(int nochdir, int noclose); DESCRIPTION The daemon() function is for programs wishing...

凌云天空的博客 918

linux deamon 日志,linux实现daemon程序

编写Linux系统下Daemon程序的方法步骤一、引言 Daemon程序是一直运行的服务端程序,又称为守护进程。本文介绍了在Linux下编写Daemon程序的步骤,并给出了例子程序。二、Daemon程序简介Daemon是长时间运行的进程,通常在系统启动后就运行,在系统关闭时才结束。一般说Daemon程序在后台运行,是因为它没有控制终端,无法和前台的用户交互。Daemon程序一般都作为服务程序使用,...

weixin_33933280的博客 236

Linux daemon进程原理与使用

什么情况下用daemon进程生产环境下,除了我们ssh登录上去,然后手动跑的那部分以外,其他都是自动运行的,这些大部分都应该是后台执行的。如何才能后台执行呢? nohup ./XXX & 由系统的其他daemon进程启动。这样的话,你的程序是它的子进程,跟终端没关系。退出终端也不会导致进程退出。如写在crontab里。 写成daemon程序,可以手动执行,退出终端时程序不退出。 如何选择呢? (1

纯,属虚构 7825

linux实现daemon程序

http://linux.chinaitlab.com/c/798692.html 注:SIGTERM 程序结束(terminate)信号,与SIGKILL不同的是该信号可以被阻塞和处理通常用来要求程序自己正常退出. shell命令kill缺省产生这个信号.    编写Linux系统下Daemon程序的方法步骤   一、引言 Daemon程序是一直运行的服务端程序,又称为守护进程。

窝磊哥去 2176

[C++]-Linux中创建Daemon程序

文章目录守护进程后台进程编写守护进程forkdaemon Linux中的守护进程(daemon进程)相当于Windows中的后台服务程序,一直运行于后台。 守护进程 Linux中,每一个与用户进行交流的界面称为终端,每一个从此终端允许的进程都会依附于此终端,因此这个终端也称为这些进程的控制终端;当控制终端被关闭时,相应的进程都会自动关闭。若不想让进程因终端的关闭或变化而受影响,就需要把进程变为守护进程。 守护进程(Daemon进程)是脱离于终端(避免进程在执行过程中的信息在任何终端上显示,且进程也不会被任何

飞鹰技术 760

Linux系统编程之daemon进程创建

1 umask 1.1 对应系统调用sys_umask,源码实现在/kernel/sys.c中,SYSCALL_DEFINE1(umask, int, mask) 利用传进来的参数mask对当前进程的文件结构体掩码进行赋值:xchg(&amp;amp;current-&amp;gt;fs-&amp;gt;umask, mask &amp;amp; S_IRWXUGO); task_struct结构体中fs的...

北方南方 2536

DLT:dlt-daemon示例解析

dlt-daemon中带有一些示例程序,路径为dlt-daemon/examples/,这里对example1进行解析。这个示例展示了怎样创建dlt程序,包括注册和取消注册,发送log等。

gdizcm的专栏 2532
上一篇: 系统运维 | Ubuntu 下安装配置 samba 服务的详细过程
下一篇: 程序人生 | UNIX 网络编程之 getaddrinfo 函数详解及使用举例
dbkernel
博客等级 码龄4年 60粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值