守护进程
- 格式:doc
- 大小:157.50 KB
- 文档页数:6
python守护进程的理解在 Python 中,守护进程(Daemon Process)是一种特殊的进程,它的主要目的是在后台运行,并且不会阻止主程序的退出。
守护进程通常用于执行一些长期运行的任务,例如监听网络连接、执行定时任务或运行后台服务。
当我们在 Python 中创建一个守护进程时,可以使用 `daemon` 模块来实现。
通过将一个进程设置为守护进程,我们可以确保在主程序退出时,守护进程也会被终止。
这对于确保程序的干净关闭和资源的释放非常重要。
以下是一个简单的示例,展示了如何在 Python 中创建一个守护进程:```pythonfrom daemon import DaemonContextdef myDaemon():print("Daemon started")# 执行守护进程的逻辑while True:passif __name__ == "__main__":with DaemonContext():myDaemon()```在上述示例中,我们定义了一个名为 `myDaemon` 的函数,它将作为守护进程的执行体。
然后,我们使用 `DaemonContext` 创建一个上下文环境,在该环境中启动守护进程。
需要注意的是,将一个进程设置为守护进程后,它将在后台运行,并与主程序的生命周期解耦。
这意味着,即使主程序退出,守护进程仍然会继续运行。
因此,在设计守护进程时,需要确保它能够独立地处理异常情况,并在必要时进行适当的清理操作。
总的来说,守护进程在 Python 中是一种用于在后台运行任务的有用工具,它可以确保程序的可靠性和稳定性。
但在使用守护进程时,需要谨慎处理其与主程序的关系,并确保在程序终止时正确释放资源。
守护进程架构设计守护进程听起来就很神秘又很厉害的样子呢。
它就像一个默默守护城堡的小卫士,一直在后台运行,确保系统的某些功能能够正常运转。
一、守护进程是啥呀。
守护进程简单来说,就是在后台运行,不与用户直接交互的进程。
它就像一个低调的幕后英雄,你可能看不到它的存在,但是它却在为整个系统的稳定和顺畅做着巨大的贡献。
比如说,在服务器上,守护进程可能负责监控网络连接,一旦有新的连接请求过来,它就得赶紧去处理,就像一个超级热心的招待员,虽然你看不到它在忙前忙后,但是它的工作成果你是能感受到的,像网络一直保持通畅之类的。
二、守护进程的架构。
守护进程的架构有点像一个精心搭建的小王国。
1. 启动部分。
这个就像是王国的大门开启仪式。
守护进程启动的时候,它得知道自己是为啥而存在的。
是要监控文件的变化呢,还是要管理网络通信呀?这就像是它的使命被确定下来。
在启动的过程中,它要做很多准备工作,就像一个要出门远行的人,得检查自己的背包(各种资源的初始化),看看有没有带齐东西。
而且启动的时候还要考虑到和其他进程或者系统组件的关系,不能一上来就乱抢资源,得有礼貌,要和大家和谐共处。
2. 运行核心。
这是守护进程的心脏地带。
这里它要做的事情可多啦。
如果是监控文件的守护进程,那它就得不停地查看文件有没有被修改、被删除或者被新增。
它就像一个超级警惕的小侦探,眼睛一刻也不离开目标。
在运行核心部分,还得处理各种异常情况。
比如说突然文件打不开了,或者网络中断了,它可不能就傻在那里,得有应对的策略。
就像你在路上突然遇到一个大坑,你得想办法绕过去或者把坑填平一样。
3. 通信机制。
守护进程不能自己闷头干活,它有时候得和其他进程或者系统的部分说说话呢。
这个通信机制就像是它的传声筒。
可能是通过共享内存,就像大家共用一个小黑板来传递信息;也可能是通过消息队列,就像排队传递纸条一样。
这样它就能知道系统的其他部分在干啥,也能告诉别人自己这边的情况。
三、设计守护进程架构要注意的点。
Supervisor为服务创建守护进程 今天需要再服务上部署⼀个.net ⽅⾯的项⽬;当时开启服务的命令只能在前台执⾏;使⽤nohub CMD &等放在后台开启服务都会宕机;所以搜寻了Supervisor 这个解决办法,为服务创建守护进程。
具体操作如下1、什么是守护进程 在linux或者unix操作系统中,守护进程(Daemon)是⼀种运⾏在后台的特殊进程,它独⽴于控制终端并且周期性的执⾏某种任务或等待处理某些发⽣的事件。
由于在linux中,每个系统与⽤户进⾏交流的界⾯称为终端,每⼀个从此终端开始运⾏本篇的创建守护进程,是指发布在Linux上 core 程序的dotnet xxx.dll命令的宿主进程创建⼀个守护进程。
在 Linux 上有很多可以管理进程的⼯具,我们使⽤ Supervisor 来做这个事情。
原因有两点:1、它是微软官⽅⽂档推荐的,降低学习成本。
2、它并不⼀定是最好的,但⼀定是⽂档最全的。
2、认识 Supervisor2.1 Supervisor 介绍官⽅⽂档: Supervisor是⼀个客户端/服务器系统,采⽤ Python(2.4+) 开发的,它是⼀个允许⽤户管理,基于 Unix 系统进程的 Client/Server 系统,提供了⼤量功能来实现对进程的管理。
2.2 Supervisor 特征简单Supervisor通过简单的INI样式(可以修改为.conf后缀)配置⽂件进⾏配置,该⽂件易于学习。
它提供了许多每个进程选项,使您的⽣活更轻松,如重新启动失败的进程和⾃动⽇志轮换。
集中主管为您提供⼀个启动,停⽌和监控流程的位置。
流程可以单独控制,也可以成组控制。
您可以将Supervisor配置为提供本地或远程命令⾏和Web界⾯。
⾼效主管通过fork / exec启动其⼦进程,⼦进程不进⾏守护。
当进程终⽌时,操作系统会⽴即向Supervisor发出信号,这与某些依赖⿇烦的PID⽂件和定期轮询重新启动失败进程的解决⽅案不同。
Python如何实现守护进程的⽅法⽰例场景设置:你编写了⼀个python服务程序,并且在命令⾏下启动,⽽你的命令⾏会话⼜被终端所控制,python服务成了终端程序的⼀个⼦进程。
因此如果你关闭了终端,这个命令⾏程序也会随之关闭。
要使你的python服务不受终端影响⽽常驻系统,就需要将它变成守护进程。
守护进程就是Daemon程序,是⼀种在系统后台执⾏的程序,它独⽴于控制终端并且执⾏⼀些周期任务或触发事件,通常被命名为"d"字母结尾,如常见的httpd、syslogd、systemd和dockerd等。
代码实现python可以很简洁地实现守护进程,下⾯先给出代码和相应注释:# coding=utf8import osimport sysimport atexitdef daemonize(pid_file=None):"""创建守护进程:param pid_file: 保存进程id的⽂件:return:"""# 从⽗进程fork⼀个⼦进程出来pid = os.fork()# ⼦进程的pid⼀定为0,⽗进程⼤于0if pid:# 退出⽗进程,sys.exit()⽅法⽐os._exit()⽅法会多执⾏⼀些刷新缓冲⼯作sys.exit(0)# ⼦进程默认继承⽗进程的⼯作⽬录,最好是变更到根⽬录,否则回影响⽂件系统的卸载os.chdir('/')# ⼦进程默认继承⽗进程的umask(⽂件权限掩码),重设为0(完全控制),以免影响程序读写⽂件os.umask(0)# 让⼦进程成为新的会话组长和进程组长os.setsid()# 注意了,这⾥是第2次fork,也就是⼦进程的⼦进程,我们把它叫为孙⼦进程_pid = os.fork()if _pid:# 退出⼦进程sys.exit(0)# 此时,孙⼦进程已经是守护进程了,接下来重定向标准输⼊、输出、错误的描述符(是重定向⽽不是关闭, 这样可以避免程序在 print 的时候出错)# 刷新缓冲区先,⼩⼼使得万年船sys.stdout.flush()sys.stderr.flush()# dup2函数原⼦化地关闭和复制⽂件描述符,重定向到/dev/nul,即丢弃所有输⼊输出with open('/dev/null') as read_null, open('/dev/null', 'w') as write_null:os.dup2(read_null.fileno(), sys.stdin.fileno())os.dup2(write_null.fileno(), sys.stdout.fileno())os.dup2(write_null.fileno(), sys.stderr.fileno())# 写⼊pid⽂件if pid_file:with open(pid_file, 'w+') as f:f.write(str(os.getpid()))# 注册退出函数,进程异常退出时移除pid⽂件atexit.register(os.remove, pid_file)概括⼀下守护进程的编写步骤:1. fork出⼦进程,退出⽗进程2. ⼦进程变更⼯作⽬录(chdir)、⽂件权限掩码(umask)、进程组和会话组(setsid)3. ⼦进程fork孙⼦进程,退出⼦进程4. 孙⼦进程刷新缓冲,重定向标准输⼊/输出/错误(⼀般到/dev/null,意即丢弃)5. (可选)pid写⼊⽂件理解⼏个要点为什么要fork两次第⼀次fork,是为了脱离终端控制的魔⽖。
daemon的作用Daemon(守护进程)的作用在计算机系统中,守护进程(Daemon)是一种在后台运行的特殊进程,它的存在是为了提供一种持续运行的服务或功能。
守护进程通常在操作系统启动时自动启动,并且在整个系统运行期间保持活动状态,不受用户登录或注销的影响。
它们在后台默默地执行任务,为用户提供服务,同时不会干扰其他正在运行的程序。
守护进程的作用主要体现在以下几个方面:1. 服务提供:守护进程通常用于提供服务,例如网络服务、数据库服务、邮件服务等。
这些服务需要在后台持续运行,以便随时响应用户的请求。
通过守护进程,这些服务可以在系统启动时自动启动,并且始终保持运行状态,为用户提供稳定可靠的服务。
2. 资源管理:守护进程还可以用于系统资源的管理和监控。
例如,系统中的进程监控守护进程可以监控其他进程的运行状态,当发现异常或错误时可以及时采取相应措施,以保证系统的稳定性和安全性。
另外,守护进程还可以监控系统的硬件资源,如内存、磁盘空间等,及时采取措施进行资源调度和管理。
3. 日志记录:守护进程通常负责记录系统的日志信息。
日志是系统运行过程中产生的重要信息,包括错误日志、事件日志、访问日志等。
通过守护进程将这些日志信息进行记录和保存,可以方便用户进行故障排查和系统性能分析。
4. 定时任务:守护进程可以用于执行定时任务。
定时任务是指在指定的时间点或时间间隔内执行某种操作或任务。
守护进程可以根据预设的时间表,自动执行这些定时任务,如备份数据、清理临时文件等。
通过守护进程的定时任务功能,可以提高系统的效率和自动化程度。
5. 进程管理:守护进程还可以进行进程管理,包括进程的创建、销毁、状态监控等。
通过守护进程,系统管理员可以方便地管理系统中的各个进程,包括控制进程的运行、停止、重启等操作,以确保系统的稳定性和安全性。
总结起来,守护进程在计算机系统中起着重要的作用。
它们在后台默默地执行任务,为用户提供服务,并保持系统的稳定性和安全性。
systemd 读法systemd 是一种开源的系统管理守护进程,广泛应用于现代 Linux 系统中。
它的名称来源于“system daemon”,意为系统守护进程。
systemd 的设计目标是取代传统的 init 系统,以提供更快速、可靠和高效的系统启动和管理。
systemd 的读法是“系统D”,其中的“D”代表守护进程(daemon)。
守护进程是在后台运行的特殊进程,用于执行系统任务、管理硬件设备和提供服务。
systemd 作为一个守护进程,负责启动和管理其他进程,使系统更加稳定和高效。
systemd 的设计理念是“一切皆单元(Everything is a unit)”。
在 systemd 中,所有的系统资源和服务都被抽象为一个个单元(unit),并使用一个统一的配置文件来管理。
每个单元都有一个唯一的标识符,用来指定其类型和属性。
systemd 可以同时管理多个单元,实现并行启动和管理,大大提高了系统的启动速度和稳定性。
systemd 的配置文件采用了简洁而灵活的 INI 格式,易于阅读和编辑。
配置文件中可以定义单元的类型、依赖关系、启动顺序、资源限制等信息。
通过配置文件,可以灵活地定制系统启动过程和服务管理规则,满足不同系统的需求。
systemd 提供了丰富的命令行工具,用于管理系统单元和查看系统状态。
其中最常用的命令是 systemctl,它可以启动、停止、重启、查看状态和管理系统单元。
通过 systemctl 命令,管理员可以方便地管理系统服务、定位故障和监控系统运行状态。
systemd 还引入了 cgroups(control groups)机制,用于对进程进行资源限制和管理。
通过 cgroups,systemd 可以对每个进程组进行资源分配和限制,确保系统资源的合理利用和保护。
这对于多任务并发的系统来说非常重要,可以避免一个进程占用过多资源而导致系统崩溃或变慢。
除了基本的系统管理功能,systemd 还提供了其他高级特性,如日志管理、用户会话控制、定时任务管理等。
守护进程(daemon)就是⼀直在后台运⾏的进程//fork执⾏中已经出现⽗和⼦进程,状态⼀样但不是相同的进程,两条进程执⾏序都指向了fork函数内创建进程代码后⾯⼀句的指令集,//此时是⽗进程占据cpu时间,⽗进程继续执⾏根据fork后⾯的代码实现返回创建的pid,//⼦进程之后继续执⾏根据fork代码实现返回的是0//创建⼦进程失败返回-1$pid = pcntl_fork();if (-1 === $pid) {throw new Exception('fork fail');} elseif ($pid > 0) {exit(0);}在Linux/UNIX系统引导的时候会开启很多服务,这些服务称为守护进程(也叫Daemon进程)。
守护进程是脱离于控制终端并且在后台周期性地执⾏某种任务或等待处理某些事件的进程,脱离终端是为了避免进程在执⾏过程中的信息在任何终端上显⽰并且进程也不会被任何终端所产⽣的中断信息所终⽌。
创建守护进程的⼀般步骤:(1) 创建⼦进程,退出⽗进程为了脱离控制终端需要退出⽗进程,之后的⼯作都由⼦进程完成。
在Linux中⽗进程先于⼦进程退出会造成⼦进程成为孤⼉进程,⽽每当系统发现⼀个孤⼉进程时,就会⾃动由1号进程(init)收养它,这样,原先的⼦进程就会变成init进程的⼦进程。
ps –ef | grep ProcName 通过PID/PPID查看进程的⽗⼦关系(2) 在⼦进程中创建新的会话使⽤系统函数setsid来完成。
man 2 setsid 查看关于setsid函数的说明setsid – creates a session and sets theprocess group ID#include <unistd.h>pid_t setsid(void);setsid() creates a new session if thecalling process is not a process group leader. The calling process is theleader of the new session, the process group leader of the new process group,and has no controlling tty. The process group ID and session ID of the callingprocess are set to the PID of the calling process. The calling process will bethe only process in this new process group and in this new session.进程组:是⼀个或多个进程的集合。
linux启动守护进程的方法在Linux系统中,守护进程(daemon)是一种在后台运行的进程,它不依赖于用户终端,并且在系统启动时自动启动。
守护进程通常用于执行一些系统级任务,如网络服务、定时任务等。
本文将介绍在Linux系统中启动守护进程的方法。
1. 使用init.d脚本在早期的Linux系统中,使用init.d脚本是启动守护进程的常见方式。
这些脚本位于/etc/init.d目录下,以及/etc/rc.d/init.d目录下,不同的发行版可能会有所不同。
通过编写一个init.d脚本,可以定义守护进程的启动、停止、重启等操作。
init.d脚本一般包括以下几个步骤:- 设置脚本的执行权限:chmod +x /etc/init.d/your_daemon- 定义启动、停止、重启等操作函数:start()、stop()、restart()等- 定义启动优先级:通过在脚本中添加注释指定启动顺序,如# chkconfig: 2345 80 20- 将脚本链接到相应的运行级别目录中:ln -s /etc/init.d/your_daemon /etc/rc.d/rcX.d/S80your_daemon2. 使用systemd单元文件在较新的Linux系统中,systemd已经取代了传统的init进程作为系统的init系统。
systemd使用单元文件(unit file)来管理系统服务,通过编写一个单元文件,可以定义守护进程的启动方式、依赖关系等信息。
一个简单的systemd单元文件示例如下:```[Unit]Description=Your DaemonAfter=network.target[Service]ExecStart=/path/to/your_daemonType=simpleRestart=alwaysUser=your_user[Install]WantedBy=default.target```将上述内容保存为your_daemon.service,并将其放置在/etc/systemd/system目录下。
linux守护进程课程设计一、教学目标本课程的学习目标包括知识目标、技能目标和情感态度价值观目标。
知识目标要求学生掌握Linux守护进程的基本概念、创建方法以及常用系统调用。
技能目标要求学生能够独立编写脚本创建守护进程,并了解守护进程在实际应用中的配置和管理。
情感态度价值观目标则是培养学生对Linux系统的兴趣和好奇心,提高他们对开源技术的认同感和责任感。
通过本课程的学习,学生将能够理解Linux系统中守护进程的作用和重要性,熟练掌握守护进程的创建和管理方法,为后续的Linux系统编程和运维工作打下坚实基础。
二、教学内容本课程的教学内容主要包括Linux守护进程的基本概念、创建方法、常用系统调用以及守护进程的配置和管理。
1.Linux守护进程的基本概念:介绍守护进程的定义、特点和作用,以及守护进程与普通进程的区别。
2.守护进程的创建方法:讲解如何在Linux系统中创建守护进程,包括使用fork()、setsid()和fork()/setsid()组合等方法。
3.常用系统调用:介绍守护进程在运行过程中常用的系统调用,如write()、read()、open()等,以及如何在守护进程中使用这些系统调用。
4.守护进程的配置和管理:讲解如何配置和管理Linux系统中的守护进程,包括查看守护进程状态、设置守护进程优先级、守护进程的日志输出等。
三、教学方法本课程将采用讲授法、讨论法、案例分析法和实验法等多种教学方法。
1.讲授法:通过讲解Linux守护进程的基本概念、创建方法、常用系统调用和配置管理等内容,使学生掌握守护进程的相关知识。
2.讨论法:学生就守护进程的实际应用场景、遇到的问题和解决方案进行讨论,提高学生的思考和分析能力。
3.案例分析法:通过分析典型的Linux守护进程案例,使学生更好地理解守护进程在实际应用中的作用和配置方法。
4.实验法:安排学生动手实践,编写脚本创建守护进程,并配置和管理Linux系统中的守护进程,提高学生的实际操作能力。
一、什么是守护进程?守护进程是脱离于终端并且在后台运行的进程。
(1)守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显示(2)并且进程也不会被任何终端所产生的终端信息所打断。
守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程。
它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。
守护进程常常在系统引导装入时启动,在系统关闭时终止。
Linux系统有很多守护进程,大多数服务都是通过守护进程实现的,例如web服务。
守护进程最大的特点是运行在后台,与终端无连接,除非特殊情况下,用户不能操作守护进程。
由于在Linux中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭。
但是守护进程却能够突破这种限制,它从被执行开始运转,直到整个系统关闭时才退出。
如果想让某个进程不因为用户或终端或其他地变化而受到影响,那么就必须把这个进程变成一个守护进程。
二、守护进程的特性守护进程最重要的特性是后台运行。
其次,守护进程必须与其运行前的环境隔离开来。
这些环境包括未关闭的文件描述符,控制终端,会话周期和进程组,工作目录以及文件创建掩模等。
这些环境通常是守护进程从执行它的父进程(特别是shell)中继承下来的。
最后,守护进程的启动方式有其特殊之处。
它可以在Linux系统启动时从启动脚本/etc/r c.d中启动,可以由作业规划进程crond启动,还可以由用户终端(通常是shell)执行。
总之,除开这些特殊性以外,守护进程与普通进程基本上没有什么区别。
因此,编写守护进程实际上是把一个普通进程按照上述的守护进程的特性改造成为守护进程。
三、进程后台运行与守护进程的区别当进程处在后台运行时,关闭终端,则会将进程关闭;但是当关闭终端时,守护进程继续运行。
例如:(1)使之在后台运行:(2)使用ps -aux 命令发现./a.out 进程仍在运行(3)关闭终端后,重新打开,发现./a.out 进程已经被杀死(4)但守护进程则不会被杀死,如下图:四,前台进程和终端的关系当程序正在进行时,如果我想关闭终端则会出现以下提示:如果选择“关闭终端”,则进程也会被杀死。
五、如何创建一个简单的守护进程:1、创建子进程,父进程退出这是编写守护进程的第一步。
由于守护进程是脱离控制终端的,因此,完成第一步后就会在Shell终端里造成一程序已经运行完毕的假象。
之后的所有工作都在子进程中完成,而用户在Shell终端里则可以执行其他命令,从而在形式上做到了与控制终端的脱离。
在Linux中父进程先于子进程退出会造成子进程成为孤儿进程,而每当系统发现一个孤儿进程是,就会自动由1号进程(init)收养它,这样,原先的子进程就会变成init进程的子进程。
2、在子进程中创建新会话这个步骤是创建守护进程中最重要的一步,虽然它的实现非常简单,但它的意义却非常重大。
在这里使用的是系统函数setsid,在具体介绍setsid之前,首先要了解两个概念:进程组和会话期进程组:是一个或多个进程的集合。
进程组有进程组ID来唯一标识。
除了进程号(PI D)之外,进程组ID也是一个进程的必备属性。
每个进程组都有一个组长进程,其组长进程的进程号等于进程组ID。
且该进程组ID不会因组长进程的退出而受到影响。
会话周期:会话期是一个或多个进程组的集合。
通常,一个会话开始于用户登录,终止于用户退出,在此期间该用户运行的所有进程都属于这个会话期。
接下来就可以具体介绍setsid的相关内容:(1)setsid函数作用:setsid函数用于创建一个新的会话,并担任该会话组的组长。
调用setsid有下面的3个作用:让进程摆脱原会话的控制让进程摆脱原进程组的控制让进程摆脱原控制终端的控制那么,在创建守护进程时为什么要调用setsid函数呢?由于创建守护进程的第一步调用了fork函数来创建子进程,再将父进程退出。
由于在调用了fork函数时,子进程全盘拷贝了父进程的会话期、进程组、控制终端等,虽然父进程退出了,但会话期、进程组、控制终端等并没有改变,因此,还还不是真正意义上的独立开来,而setsid函数能够使进程完全独立出来,从而摆脱其他进程的控制。
3、改变当前目录为根目录这一步也是必要的步骤。
使用fork创建的子进程继承了父进程的当前工作目录。
由于在进程运行中,当前目录所在的文件系统(如“/mnt/usb”)是不能卸载的,这对以后的使用会造成诸多的麻烦(比如系统由于某种原因要进入但用户模式)。
因此,通常的做法是让"/ "作为守护进程的当前工作目录,这样就可以避免上述的问题,当然,如有特殊需要,也可以把当前工作目录换成其他的路径,如/tmp。
改变工作目录的常见函数式chdir。
4、重设文件权限掩码文件权限掩码是指屏蔽掉文件权限中的对应位。
比如,有个文件权限掩码是050,它就屏蔽了文件组拥有者的可读与可执行权限。
由于使用fork函数新建的子进程继承了父进程的文件权限掩码,这就给该子进程使用文件带来了诸多的麻烦。
因此,把文件权限掩码设置为0,可以大大增强该守护进程的灵活性。
设置文件权限掩码的函数是umask。
在这里,通常的使用方法为umask(0)。
5、关闭文件描述符同文件权限码一样,用fork函数新建的子进程会从父进程那里继承一些已经打开了的文件。
这些被打开的文件可能永远不会被守护进程读写,但它们一样消耗系统资源,而且可能导致所在的文件系统无法卸下。
6、忽略SIGCHLD信号这一步只对需要创建子进程的守护进程才有必要,很多服务器守护进程设计成通过派生子进程来处理客户端的请求,如果父进程不对SIGCHLD信号进行处理的话,子进程在终止后变成僵尸进程,通过将信号SIGCHLD的处理方式设置为SIG_IGN可以避免这种情况发生。
为什么忽略SIGCHLD信号?因为子进程终止后,会产生SIGNCHLD信号,父进程对此信号的处理方式是忽略的,那么子进程退出后会成为僵尸进程,所以我们需要将SIGCHLD的处理方式设置为SIG_IGN,这样子进程在退出后成为僵尸进程后,会被init接管。
7、用日志系统记录出错信息因为守护进程没有控制终端,当进程出现错误时无法写入到标准输出上,可以通过调用s yslog将出错信息写入到指定的文件中。
8、守护进程退出处理当用户需要外部停止守护进程运行时,往往会使用kill命令停止该守护进程。
所以,守护进程中需要编码来实现kill发出的signal信号处理,达到进程的正常退出。
在上面的第二步之后,守护进程已经与所属的控制终端失去了联系。
因此从终端输入的字符不可能达到守护进程,守护进程中用常规方法(如printf)输出的字符也不可能在终端上显示出来。
所以,文件描述符为0、1和2 的3个文件(常说的输入、输出和报错)已经失去了存在的价值,也应被关闭。
通常按如下方式关闭文件描述符:===============================for(i=0;i<MAXFILE;i++)close(i);===============================这样,一个简单的守护进程就建立起来了。
实现守护进程的完整实例(每隔10s在/tmp/dameon.log中写入一句话):==========================================#include<stdio.h>#include<stdlib.h>#include<string.h>#include<fcntl.h>#include<sys/types.h>#include<unistd.h>#include<sys/wait.h>#define MAXFILE 65535int main(void){pid_t pid;int i, fd, len;char *buf = "this is a Dameon\n";len = strlen(buf);pid = fork(); //第一步if(pid < 0){printf("error fork\n");exit(1);}else if(pid>0){exit(0);}setsid(); //第二步chdir("/"); //第三步umask(0); //第四步for(i=0;i<MAXFILE;i++){ //第五步close(i);}while(1){if((fd=open("/tmp/dameon.log",O_CREAT|O_WRONLY|O_APPEND,0600))<0){ perror("open failed");exit(1);}write(fd,buf,len+1);close(fd);sleep(10);}return 0;}。