简单实现一个守护进程(Daemon)

学习进程就不得不提到一个运行在后台的特殊进程——守护进程。(也称精灵进程)。Linux系统启动时会启动很多系统服务进程,这些系统服务进程没有控制终端,不能直接和用户交互。其它进程都是在用户登录或运行程序时创建,在运行结束或用户注销时终止,但系统服务进程不受用户登录注销的影响,它们一直在运行着而我们就将这种进程称为守护进程。

守护进程独立于控制终端并周期性的执行某种任务或者等待处理某些发生的事件。守护进程是一种很有用的进程。Linux的大多数服务器就是用1守护进程实现的,比如,Internet服务器inetd、Web服务器httpd等。此外,守护进程还可以完成许多系统任务,比如作业规划进程crond等。

可以使用ps axj命令查看系统中的进程。

(由于太多只截取了一部分)

还可以使用相关参数来有选择性的查看。参数a表示不仅列当前用户的进程,也列出所有其他用户的进程,参数x表示不仅列有控制终端的进程,也列出所有无控制终端的进程,参数j表示列出与作业控制相关的信息。

使用参数x来进行查看。

了解了守护进程的概念之后,自己也可以来写一个守护进程。

创建守护进程最关键的一步是调用setsid函数创建一个新的Session,并成为Session Leader。

在调用这个函数之前,当前进程不允许是进程组的Leader,否则该函数返回-1。要保证当前进程不是进程组的Leader只要先fork再调用setsid就行了。fork创建的子进程和父进程在同一个进程组中,进程组Leader必然是该组的第一个进程,所以子进程不可能是该组的第一个进程,在子 进程中调用setsid就不会有问题了。

创建守护进程可以按照如下步骤进行:

1、 调用umask函数将文件模式创建屏蔽字设置为0;

2、调用fork,父进程退出(exit);

3、调用setsid创建一个新会话;

4.、将当前工作目录更改为根目录;

5、 关闭不在需要的文件描述符;

6.、其他:忽略SIGCHLD信号。

#include <stdio.h> 
#include <signal.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <fcntl.h>
#include <sys/stat.h> 
void creat_daemon() {     
int i;     
int fd0;     
pid_t pid;     
struct sigaction sa;      
umask(0);      
if( (pid = fork()) < 0 )
{      }
else if (pid != 0)
{          exit(0);  //终止父进程     }        
setsid(); //设置新会话     
sa.sa_handler = SIG_IGN;     
sigemptyset(&sa.sa_mask);    
sa.sa_flags = 0;     
if( sigaction(SIGCHLD, &sa, NULL ) < 0 )
{       return;     }        
if( (pid = fork())<0)
 {printf("fork error!\n");         
     return;     }
else if( pid != 0)
     {          exit(0);     }        
if( chdir("/") < 0 )
     {printf("child dir error\n");        
      return;
      }
close(0);     
fd0 = open("/dev/null", O_RDWR); 
dup2(fd0, 1);      
dup2(fd0, 2); 
 } 
int main() 
{     creat_daemon();   
  while(1)     
  {            
  sleep(1);    
   }   
 }
时间: 2024-10-24 23:10:07

简单实现一个守护进程(Daemon)的相关文章

如何编写一个守护进程daemon

大体步骤如下 1.   调用fork()函数创建子进程后,让父进程立即exit(),这样产生的子进程变成孤儿进程,由init进程接管. 2.   调用setsid()函数,使得新创建的进程脱离控制终端,同时创建新的进程组,并成为该进程组的首进程.在linux系统中,所有的进程都属于各自的进程组,进程组是一个或多个进程的集合,一个进程组中至少有一个进程成员,否则就消亡了.每个进程组都有一个进程组ID,是由领头进程的进程号决定的,会话则是一个或多个进程组的集合,每个会话都有一个领头进程,会话和进程组

创建一个守护进程

一.概述:守护进程也称精灵进程(Daemon),是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程是随系统启动而存在,随系统关闭而消失的进程(也就是开机之后就会存在,关机才消失).守护进程是一种很有用的进程,Linux的大多数服务器就是用守护进程实现的. 在终端运行命令:ps axj | head 参数a表示不仅列出当前用户进程,也列出所有其它用户进程. 参数x表示不仅列出有控制终端的进程,也列出所有无控制终端的进程. 参数j表示列出与作业控制

从时间进程日志上面了解守护进程daemon的使用

说起进程呢? 在俺心中永远有种高大上的感觉,哈哈,自从了解到了进程方面的东西,也觉得进程这个执行过程真的很神奇,但是在了解到了还有守护进程方面的东东的时候又觉得貌似更加的让俺魂不守舍啦!觉得自己可以做到  觉得从一名屌丝立马逆袭成了高大上啦.O(∩_∩)O哈哈~ 那么,进程守护具体是什么呢?相信看这篇文章的牛牛们都对这方面有一定的了解啦.所以就带着复习或者巩固或者挑刺的心理来看看吧. 上面就是大致的创建守护进程的步骤啦,用语言来描述的话,共需要5步即可建立一个守护进程: 1>用fork()函数创

python 守护进程(daemon)

#!/usr/bin/env python # -*- coding:utf-8 -*- import sys, os '''将当前进程fork为一个守护进程    注意:如果你的守护进程是由inetd启动的,不要这样做!inetd完成了    所有需要做的事情,包括重定向标准文件描述符,需要做的事情只有chdir()和umask()了 ''' def daemon(stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):     #

一个守护进程实例

void DaemonInit(void){ //LOG::INF("[ServerMeeting] 服务初始化.\n"); int pid; //如果是父进程,结束父进程,子进程继续 if(pid=fork()) { exit(0); } /*else if(pid<0) // 不可能进入 { exit(1); //fork失败,退出 }*/ //是第一子进程,后台继续执行 setsid();//第一子进程成为新的会话组长和进程组长 //并与控制终端分离 if(pid=fork

【Linux学习】编写一个守护进程

题目: 编写一个守护进程,每隔3秒钟将当前时间输出.要求: 不能使用init_daemon系统调用. #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <time.h> #include <unistd.h> int main(void) { pid_t pid; pid = fork(); if(pid > 0) { exit(0); } if(0 ==

python实现的守护进程(Daemon)的代码

将开发过程经常用的一些代码段记录起来,下边代码段是关于python实现的守护进程(Daemon)的代码,希望对小伙伴有一些用. def createDaemon(): "'Funzione che crea un demone per eseguire un determinato programma-"' import os # create - fork 1 try: if os.fork() > 0: os._exit(0) # exit father- except OS

.NET跨平台实践:用C#开发Linux守护进程-Daemon

Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为Linux开发与控制台无关的,需要在后台长时间不间断运行的“服务程序”,Daemon技术是非常重要的. Daemon程序一般用c/c++开发.不过,我今天要讲的,不是怎么用c/c++开发daemon,而是用C#! 一,创建Daemon程序: 用VS新建一个控制台项目,假设名称是MyDaemon,输入下

linux下的守护进程daemon

什么是守护进程?其实感觉守护进程并没有什么明确的定义,只是守护进程有一些特征,这是它需要遵循的. 守护进程的第一个特征是长时间在后台运行的程序,并且主要是为了提供某种服务,而为了能够让服务尽可能随时都可用,就要求这个服务是一直运行的,于是守护进程就守护着这个服务不挂掉.linux里面常见的守护进程一般都是以d结尾的,比如apache的httpd,samba的smbd,ssh的sshd. 它的第二个特征是与启动它的进程的环境隔离,包括关闭它打开的所有文件描述符,终端,会话,进程组,某些环境变量(如