another mysql daemon,[守护进程详解及创建,daemon()使用

一,守护进程概述

Linux Daemon(守护进程)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务。Linux系统的大多数服务器就是通过守护进程实现的。常见的守护进程包括系统日志进程syslogd、 web服务器httpd、邮件服务器sendmail和数据库服务器mysqld等。

守护进程一般在系统启动时开始运行,除非强行终止,否则直到系统关机都保持运行。守护进程经常以超级用户(root)权限运行,因为它们要使用特殊的端口(1-1024)或访问某些特殊的资源。

一个守护进程的父进程是init进程,因为它真正的父进程在fork出子进程后就先于子进程exit退出了,所以它是一个由init继承的孤儿进程。守护进程是非交互式程序,没有控制终端,所以任何输出,无论是向标准输出设备stdout还是标准出错设备stderr的输出都需要特殊处理。

守护进程的名称通常以d结尾,比如sshd、xinetd、crond等

二,创建守护进程步骤

首先我们要了解一些基本概念:

进程组 :

每个进程也属于一个进程组

每个进程主都有一个进程组号,该号等于该进程组组长的PID号 .

一个进程只能为它自己或子进程设置进程组ID号

会话期:

会话期(session)是一个或多个进程组的集合。

setsid()函数可以建立一个对话期:

如果,调用setsid的进程不是一个进程组的组长,此函数创建一个新的会话期

(1)此进程变成该对话期的首进程

(2)此进程变成一个新进程组的组长进程。

(3)此进程没有控制终端,如果在调用setsid前,该进程有控制终端,那么与该终端的联系被解除。 如果该进程是一个进程组的组长,此函数返回错误。

(4)为了保证这一点,我们先调用fork()然后exit(),此时只有子进程在运行

现在我们来给出创建守护进程所需步骤:

编写守护进程的一般步骤步骤:

(1)在父进程中执行fork并exit推出;

(2)在子进程中调用setsid函数创建新的会话;

(3)在子进程中调用chdir函数,让根目录 ”/” 成为子进程的工作目录;

(4)在子进程中调用umask函数,设置进程的umask为0;

(5)在子进程中关闭任何不需要的文件描述符

说明:

在后台运行。

为避免挂起控制终端将Daemon放入后台执行。方法是在进程中调用fork使父进程终止,让Daemon在子进程中后台执行。 if(pid=fork()) exit(0);//是父进程,结束父进程,子进程继续 2. 脱离控制终端,登录会话和进程组

有必要先介绍一下Linux中的进程与控制终端,登录会话和进程组之间的关系:进程属于一个进程组,进程组号(GID)就是进程组长的进程号(PID)。登录会话可以包含多个进程组。这些进程组共享一个控制终端。这个控制终端通常是创建进程的登录终端。 控制终端,登录会话和进程组通常是从父进程继承下来的。我们的目的就是要摆脱它们,使之不受它们的影响。方法是在第1点的基础上,调用setsid()使进程成为会话组长: setsid(); 说明:当进程是会话组长时setsid()调用失败。但第一点已经保证进程不是会话组长。setsid()调用成功后,进程成为新的会话组长和新的进程组长,并与原来的登录会话和进程组脱离。由于会话过程对控制终端的独占性,进程同时与控制终端脱离。 3. 禁止进程重新打开控制终端

现在,进程已经成为无终端的会话组长。但它可以重新申请打开一个控制终端。可以通过使进程不再成为会话组长来禁止进程重新打开控制终端: if(pid=fork()) exit(0);//结束第一子进程,第二子进程继续(第二子进程不再是会话组长) 4. 关闭打开的文件描述符

进程从创建它的父进程那里继承了打开的文件描述符。如不关闭,将会浪费系统资源,造成进程所在的文件系统无法卸下以及引起无法预料的错误。按如下方法关闭它们: for(i=0;i 关闭打开的文件描述符close(i);> 5. 改变当前工作目录

进程活动时,其工作目录所在的文件系统不能卸下。一般需要将工作目录改变到根目录。对于需要转储核心,写运行日志的进程将工作目录改变到特定目录如/tmpchdir("/") 6. 重设文件创建掩模

进程从创建它的父进程那里继承了文件创建掩模。它可能修改守护进程所创建的文件的存取位。为防止这一点,将文件创建掩模清除:umask(0); 7. 处理SIGCHLD信号

处理SIGCHLD信号并不是必须的。但对于某些进程,特别是服务器进程往往在请求到来时生成子进程处理请求。如果父进程不等待子进程结束,子进程将成为僵尸进程(zombie)从而占用系统资源。如果父进程等待子进程结束,将增加父进程的负担,影响服务器进程的并发性能。在Linux下可以简单地将SIGCHLD信号的操作设为SIG_IGN。 signal(SIGCHLD,SIG_IGN); 这样,内核在子进程结束时不会产生僵尸进程。这一点与BSD4不同,BSD4下必须显式等待子进程结束才能释放僵尸进程。

三,创建守护进程

在创建之前我们先了解setsid()使用:

#include

pid_t setsid(void);

DESCRIPTION

setsid() creates a new session if the calling process is not a process group leader。

The calling process is the leader of the new session, the process group leader of the new process group, and has no control- ling tty。The process group ID and session ID of the calling process are set to the PID of the calling process。 The calling process will be the only process in this new process group and in this new session

.

//调用进程必须是非当前进程组组长,调用后,产生一个新的会话期,且该会话期中只有一个进程组,且该进程组组长为调用进程,没有控制终端,新产生的group ID 和 session ID 被设置成调用进程的PID

RETURN VALUE On success, the (new) session ID of the calling process is returned. On error, (pid_t) -1 is returned, and errno is set to indicate the error.

现在根据上述步骤创建一个守护进程:

以下程序是创建一个守护进程,然后利用这个守护进程每个一分钟向daemon.log文件中写入当前时间

[

69c5a8ac3fa60e0848d784a6dd461da6.png

复制代码

](javascript:void(0);)

#include

#include

#include

#include

#include

#include

#include

#define ERR_EXIT(m)

do{

perror(m);

exit(EXIT_FAILURE);

}while (0);

void creat_daemon(void);

int main(void){

time_t t;

int fd;

creat_daemon();

while(1){

fd = open("daemon.log",O_WRONLY|O_CREAT|O_APPEND,0644);

if(fd == -1)

ERR_EXIT("open error");

t = time(0);

char *buf = asctime(localtime(&t));

write(fd,buf,strlen(buf));

close(fd);

sleep(60);

}

return 0;}

void creat_daemon(void){

pid_t pid;

pid = fork();

if( pid == -1)

ERR_EXIT("fork error");

if(pid > 0 )

exit(EXIT_SUCCESS);

if(setsid() == -1)

ERR_EXIT("SETSID ERROR");

chdir("/");

int i;

for( i = 0; i < 3; ++i) {

close(i);

open("/dev/null", O_RDWR);

dup(0);

dup(0); }

umask(0);

return;}

)

结果:

69c5a8ac3fa60e0848d784a6dd461da6.png

复制代码](javascript:void(0);)

#include

#include

#include

#include

#include

#include

#include

#define ERR_EXIT(m)

do{\ perror(m);\ exit(EXIT_FAILURE);}

while (0);

void creat_daemon(void);

int main(void){

time_t t;

int fd;

if(daemon(0,0) == -1)

ERR_EXIT("daemon error");

while(1){

fd = open("daemon.log",O_WRONLY|O_CREAT|O_APPEND,0644);

if(fd == -1)

ERR_EXIT("open error");

t = time(0);

char *buf = asctime(localtime(&t));

write(fd,buf,strlen(buf));

close(fd);

sleep(60);

}

return 0;}

[

69c5a8ac3fa60e0848d784a6dd461da6.png

复制代码](javascript:void(0);)

当daemon(0,0)时:27591bcdaab865cb3b4f5a5f48854d40.png

QQ截图20130713190932

可以看到错误信息

现在让daemon(1,0),就是不重定向,结果如下:

9bdd9862179abac0d1e3669919f446c4.png

QQ截图20130713191221

这次普通用户执行成功了,以为没有切换到/目录下,有权限

其实我们可以利用我们刚才写的创建守护进程程序默认daemon()实现:

代码如下:

[

69c5a8ac3fa60e0848d784a6dd461da6.png

复制代码](javascript:void(0);)

#include

#include

#include

#include

#include

#include

#include

#define ERR_EXIT(m)

do{\ perror(m);\

exit(EXIT_FAILURE);}

while (0);

void creat_daemon(int nochdir, int noclose);

int main(void){

time_t t;

int fd;

creat_daemon(0,0);

while(1){

fd = open("daemon.log",O_WRONLY|O_CREAT|O_APPEND,0644);

if(fd == -1)

ERR_EXIT("open error");

t = time(0);

char *buf = asctime(localtime(&t));

write(fd,buf,strlen(buf));

close(fd);

sleep(60); }

return 0;}

void creat_daemon(int nochdir, int noclose){

pid_t pid;

pid = fork();

if( pid == -1)

ERR_EXIT("fork error");

if(pid > 0 )

exit(EXIT_SUCCESS);

if(setsid() == -1)

ERR_EXIT("SETSID ERROR");

if(nochdir == 0)

chdir("/");

if(noclose == 0){

int i;

for( i = 0; i < 3; ++i) {

close(i);

open("/dev/null", O_RDWR);

dup(0);

dup(0);

}

umask(0);

return;}

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

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

相关文章

李开复:明年会有一批AI公司倒闭

来源&#xff1a;公众号黑智概要&#xff1a;在北美的四大AI巨头公司中&#xff0c;李开复的总结是&#xff1a;Google有大牛优势&#xff1b;Facebook做得更深&#xff0c;但没有平台化意识&#xff1b;微软在试着聚拢自己的实力&#xff1b;“四大AI公司中&#xff0c;有3家不…

德勤预测2018年9大科技趋势:AR走进普通用户,直播仍然是王道

来源&#xff1a;腾讯科技编辑&#xff1a;Jennie“我们眼下正处在一个临界点&#xff0c;即机器学习将在企业市场加速普及&#xff0c;从而推动改进企业运营&#xff0c;让企业作出更好的决策&#xff0c;并提供增强或全新的产品和服务。”——德勤副总裁保罗萨罗米据外媒报道…

谷歌人工智能检索开普勒望远镜数据后,找到了“迷你太阳系”

“开普勒&#xff0d;90”和太阳系一样拥有八大行星 本文图片均来自 NASA来源&#xff1a;澎湃新闻概要&#xff1a;当地时间12月15日&#xff0c;美国国家航空航天局NASA宣布在“行星猎手”开普勒望远镜的数据库中找到了恒星“开普勒&#xff0d;90”周围的第八颗行星&#xf…

php去除所有标点符号的方法,php如何去除标点符号

php去除标点符号的方法&#xff1a;首先创建一个PHP示例文件&#xff1b;然后通过正则表达式“preg_replace($pattern, , $str);”删除字符串中的中英文标点符号即可。推荐&#xff1a;《PHP视频教程》php正则&#xff0c;删除字符串中的中英文标点符号原理很简单&#xff0c;…

美国的人工智能企业在研发哪些有趣的AI产品?

来源&#xff1a;亿欧概要&#xff1a;本文盘点了美国AI企业的有趣产品&#xff0c;或许能给国内AI创业者和投资人有所启发。同样是AI创业&#xff0c;国内外的打法显然不同。在国内&#xff0c;大部分AI创业公司都在拼主赛道&#xff0c;比如无人驾驶、AI安防、AI医疗、AI教育…

Java技术回顾之JNDI--实例

一、JNDI在Java EE中的应用JNDI 技术是Java EE规范中的一个重要“幕后”角色&#xff0c;它为Java EE容器、组件提供者和应用程序之间提供了桥梁作用&#xff1a;Java EE容器同时扮演JNDI提供者角色&#xff0c;组件提供者将某个服务的具体实现部署到容器上&#xff0c;应用程序…

【观点】智能制造:新时代智能产业革命的基石|王飞跃

来源&#xff1a; 中国科学院自动化研究所概要&#xff1a;以新的理念和新的技术发展新时期的智能制造科技&#xff0c;创新智能产业革命&#xff0c;将是中国从制造大国到制造强国&#xff0c;进而从世界大国到世界强国的必由之道和开路先锋。实体经济&#xff0c;特别是以制造…

matlab连续型随机变量,matlab连续型随机变量的分布.doc

matlab连续型随机变量的分布.doc 连续型随机变量的分布及其数字特征一、基本概念设随机变量X的分布函数为F(x)&#xff0c;若存在非负函数f(x)&#xff0c;使对任意实数x&#xff0c;有≤X{Pxd}则称X为连续型随机变量&#xff0c;并称f(x)为X的概率密度&#xff0c;它满…

CB Insights发布AI创业公司100榜单 ,7家中国公司上榜,两家二次登榜

来源&#xff1a;36氪概要&#xff1a;近日&#xff0c;硅谷知名数据公司 CB Insights 在美国旧金山发布了第二届全球最强 AI 创业公司榜单AI 100。旷视科技、出门问问、今日头条、英语流利说、优必选、商汤科技以及寒武纪上榜 。近日&#xff0c;硅谷知名数据公司 CB Insights…

深度学习发展简要笔记

来源&#xff1a;非正式组织概要&#xff1a;在Yann LeCun、Yoshua Bengio和Geoffrey Hinton三巨头nature深度学习综述《deep learning》文章中提到&#xff0c;这段期间神经网络模型被主流的计算机视觉和学术界所抛弃。一、前言深度学习的发展大致分为这么几个学期&#xff1a…

数据革命在危机中诞生 援助组织尝试灵活方法拨开战争迷雾

无国界医生组织在安曼为叙利亚提供支持。图片来源&#xff1a;Neil Brandvold来源&#xff1a;科学网概要&#xff1a;每当战争、飓风或其他灾害肆虐时&#xff0c;援助组织面临的最大问题之一就是缺乏可靠的数据。当Issam Salim&#xff08;化名&#xff09;讲述他进行的手术时…

德勤2018TMT八大预测:移动互联网迎来二次革命

来源&#xff1a;智东西概要&#xff1a;数万手机AR应用上市&#xff0c;AI芯片打入旗舰手机&#xff0c;数据中心ML芯片多样化&#xff0c;移动数字经济继续开挂。2017年&#xff0c;很多传统TMT巨头面临增长缓趋&#xff0c;于是考虑重资产化追求规模效应&#xff0c;开拓、转…

oracle 中 start tran,The value (30) of MAXTRANS parameter ignored

The value (30) of MAXTRANS parameter ignored在客户的数据库系统中(Oracle 10.2.0.3)&#xff0c;当使用expdp备份时就出现如下错误&#xff0c;非常准时。可以看到&#xff0c;这个错误就是由于备份时创建备份主表(Master Table)产生的&#xff1a;Sat Mar 7 02:40:01 2009T…

北京出台自动驾驶新规:自动驾驶车辆须配备司机应急

来源&#xff1a;人民日报概要&#xff1a;在中国境内注册的独立法人单位&#xff0c;因进行自动驾驶相关科研、定型试验&#xff0c;可申请临时上路行驶。记者今天从北京市交通委获悉&#xff0c;北京市交通委联合市公安交管局、市经济信息委等部门&#xff0c;制定发布了加快…

【未来研究】城市云脑是互联网云脑的节点,城市云脑之间如何互补与支撑

作者: 互联网进化论作者 &#xff0c;计算机博士 刘锋前言&#xff1a;本文是未来智能实验室的研究文章&#xff0c;重点探讨了基于类脑架构的智慧城市建设不应局限在城市内部&#xff0c;而是在互联网大背景下&#xff0c;不同城市之间也会发生智慧建设的协同效应。本文从城市…

JNDI全攻略

名词解释jndi是Java 命名和目录接口&#xff08;Java Naming and Directory Interface&#xff0c;JNDI&#xff09;的简称.从一开始就一直是 Java 2 平台企业版&#xff08;JEE&#xff09;的核心技术之一。在JMS&#xff0c;JMail,JDBC,EJB等技术中&#xff0c;就大量应用的这…

北京大学纳家勇治研究组在《美国国家科学院院刊》发文阐明时序记忆的神经机制

来源&#xff1a; 北京大学心理与认知科学学院官网概要&#xff1a;记忆是核心认知功能之一&#xff0c;使得人和动物能够根据经验改变自己的行为模式。近日&#xff0c;《美国国家科学院院刊》&#xff08;Proceedings of the National Academy of Sciences of the United Sta…

管道( Pipeline )模型--示例

类图 时序图 阀门接口 /*** 阀门接口* author administrator**/ public interface Valve {public String getName();public void invoke( Context context ); }基本阀门 /*** 基础阀门* author administrator**/ public class BasicValve implements Valve{private String name…

一文告诉你,NIPS 2017有多火爆 | 附PPT、视频、代码大总结

原文来源&#xff1a;Medium、GitHub作者&#xff1a;TarasSereda「雷克世界」编译&#xff1a;嗯~阿童木呀、KABUDA今年的NIPS是一场盛大的、极富教育意义和探索精神的、魅力十足且人数众多的会议。第一步&#xff0c;登记排队量子计算机Tutorials深度学习&#xff1a;实践与趋…

不入oracle数据库,Oracle数据库之操作符及函数

一、操作符&#xff1a;1、分类&#xff1a;算术、比较、逻辑、集合、连接&#xff1b;2、算术操作符&#xff1a;执行数值计算&#xff1b;--工资加1000select empno,ename,job,sal1000 from emp;3、比较操作符&#xff1a;--比较运算符(between and包头不包尾)select * from …