Linux下守护进程精析
它是一个生存期较长的进程,通常独立于终端而且周期性的运行某种须要的任务以及有时候会等待一些将会发生的事情。守护进程经常会在系统启动的时候開始运行,在系统关闭的时候关闭,它实现了linux系统中的非常多系统级的服务。
这一步就是要在外表看来让子进程与终端脱离。这个时候原先的子进程就会变为孤儿进程,那么孤儿进程就会被init进程进行收养了。
先介绍下setsid()函数的作用:
尽管父进程退出了。但原先的会话期。进程组和控制终端没有变。因此还不是真正意义上的独立了。而setsid()函数可以让进程全然的独立出来,从而脱离全部其他进程的控制哦。
特别是守护进程和终端无关,所以指向终端设备的标准输入,标准输出和标准错误流,已经失去了存在的价值。应当被关闭。通常的做法例如以下:
好了。大致的思想了解之后,接下来的事情就简单的多了,无非就是代码的实现的问题了;
以下以守护进程为出发点列举一个样例,希望能够具体的了解下,看看守护进程是怎样实现时间日志的
#include <head.h> #define daemo_mode 0
#define nomal_mode 1 int daemo() //5步创建守护进程
{
pid_t pid;
pid = fork();
if(pid < 0)
{
fprintf(stderr,"File to fork\n",strerror(errno));
exit(EXIT_FAILURE);
}
if(pid > 0)
exit(EXIT_FAILURE); if(setsid() < 0)
{
perror("File to setsid");
exit(EXIT_FAILURE);
}
chdir("/");
umask(0);
close(0);
close(1);
close(2);
return 0;
} int get_line(FILE *fp)
{
int line;
char *tmp;
char buf[4096];
while(1)
{
tmp = fgets(buf,sizeof(buf),fp);
if(tmp == NULL)
break;
if(buf[strlen(tmp) - 1] == '\n')
line++;
}
return line;
} int do_nomal(const char *filename)
{
FILE * fp;
time_t t;
struct tm *ptm;
int line = 0; fp = fopen(filename,"a+"); if(fp == NULL)
{
fprintf(stderr,"File to fopen\n",strerror(errno));
exit(EXIT_FAILURE);
} line = get_line(fp); while(1)
{
++line;
time(&t); //The realization of time
ptm = localtime(&t); sleep(1);
fflush(fp);
fprintf(fp,"%d-%d-%d",(1900+ptm->tm_year),(1+ptm->tm_mon),ptm->tm_mday);
fprintf(fp,"%d:%d:%d\n",ptm->tm_hour,ptm->tm_min,ptm->tm_sec);
}
return 0;
}
// ./a.out log 0/1
int main(int argc, const char *argv[])
{
if(argc < 3)
{
fprintf(stderr,"Usage : %s argv[1] argv[2]\n",argv[0]);
exit(EXIT_FAILURE);
}
int mode = atoi(argv[2]);
switch(mode)
{
case daemo_mode:
daemo();
break;
case nomal_mode:
break;
default:
printf("Unknow mode \n");
goto next;
}
do_nomal(argv[1]); next:
return 0;
}
Linux下守护进程精析的更多相关文章
- linux下守护进程的创建
最近在学习linux c编程 看到了守护进程的创建,感觉很好玩, 测试环境ubuntu 15.04 下面贴出测试代码 #include <stdio.h> #include <std ...
- Linux下守护进程初探
守护进程一直后台运行,与终端脱离,一般负责周期性地执行系统任务,服务器应用一般以守护进程进行运行.实现一个守护进程主要分为5部: 1.脱离父进程 2.setsid(可以选择再次fork) 3.umas ...
- linux 创建守护进程的相关知识
linux 创建守护进程的相关知识 http://www.114390.com/article/46410.htm linux 创建守护进程的相关知识,这篇文章主要介绍了linux 创建守护进程的相关 ...
- linux C守护进程编写
linux编程-守护进程编写 守护进程(Daemon)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待 处理某些发生的事件.守护进程是一种很有用的进程. Linux的大多数服 ...
- asp.net core2.0 部署centos7/linux系统 --守护进程supervisor(二)
原文:asp.net core2.0 部署centos7/linux系统 --守护进程supervisor(二) 续上一篇文章:asp.net core2.0 部署centos7/linux系统 -- ...
- 【Linux】- 守护进程的启动方法
转自:Linux 守护进程的启动方法 Linux中"守护进程"(daemon)就是一直在后台运行的进程(daemon). 本文介绍如何将一个 Web 应用,启动为守护进程. 一.问 ...
- Linux下java进程CPU占用率高分析方法
Linux下java进程CPU占用率高分析方法 在工作当中,肯定会遇到由代码所导致的高CPU耗用以及内存溢出的情况.这种情况发生时,我们怎么去找出原因并解决. 一般解决方法是通过top命令找出消耗资源 ...
- linux下对进程按照内存使用情况进行排序
linux下对进程按照内存使用情况进行排序的命令为:ps aux --sort -rss 详细解说参见 http://alvinalexander.com/linux/unix-linux-proce ...
- linux下查看进程占用端口和端口占用进程命令
Linux下查看进程占用端口: 查看程序对应进程号:ps –ef|grep 进程名 REDHAT :查看进程号所占用的端口号:netstat –nltp|grep 进程号 ubuntu:查看进程占用端 ...
随机推荐
- 融云消息接口apicloud
融云提供消息发送服务,支持个人消息,群消息,讨论组,聊天室消息, 以下是它涉及到的接口. 初始化,连接之后,可以使用. <!DOCTYPE html> <html> <h ...
- 关于viewport详解
- monyer教你玩电脑——CSS、HTML、JS、XML的关系
首先Monyer还是有必要提一句:这是一篇低中等难度的文章.如果你是高手或被认为是高手,那么请pass掉这篇文章:如果你是新手,甚至不知道什么是css(譬如百度模版)等,那么请pass掉这篇文章.谢谢 ...
- JS 引擎基础之 Shapes and Inline Caches
阅读下面这篇文章,需要20分钟: 一起了解下 JS 引擎是如何运作的吧! JS 的运作机制可以分为 AST 分析.引擎执行两个步骤: JS 源码通过 parser(分析器)转化为 AST(抽象语法树) ...
- perl编程问题
一.Hash类型 1.hash遍历输出:如果hash遍历输出的时候不是按key则会按数组输出. my %hash=(); ${hash}{"a"}="1"; $ ...
- iOS Scheme 跳转主流实现方案
iOS Scheme跳转主流实现方案主要是路由跳转,目前iOS常用路由框架是JLRouter.HHRouter.MGJRouter. 但是这些路由库都各有不足,首先是JLRouter,用不到的功能繁多 ...
- Java并发包之Semaphore用法
多线程中的同步概念就是排着队去执行一个任务,执行任务的是一个一个的执行,并不能并行执行,这样的优点是有助于程序逻辑的正确性,不会出现线程安全问题,保证软件的系统功能上的运行稳定性, Semaphore ...
- java使用默认线程池踩过的坑(二)
云智慧(北京)科技有限公司 陈鑫 是的.一个线程不可以启动两次.那么它是怎么推断的呢? public synchronized void start() { /** * A zero status v ...
- OpenCASCADE解非线性方程组
OpenCASCADE解非线性方程组 eryar@163.com Abstract. 在科学技术领域里常常提出求解非线性方程组的问题,例如,用非线性函数拟合实验数据问题.非线性网络问题.几何上的曲线曲 ...
- js---16继承
123 instanceof Number;//false,要左边是对象右边是函数 typeof 123 ; //number new Number(123) instanceof Number; / ...