Chinaunix首页 | 论坛 | 博客
  • 博客访问: 60446
  • 博文数量: 9
  • 博客积分: 1485
  • 博客等级: 上尉
  • 技术积分: 95
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-01 15:07
文章分类

全部博文(9)

文章存档

2011年(2)

2010年(1)

2009年(1)

2008年(1)

2007年(4)

最近访客

分类:

2007-11-11 20:18:46

其实,守护进程编程也没什么很深奥的。简单的说就那么几点:(当然,任何东西深入都不易!)  
     
  1.所谓守护进程,就是更外界没什么关系,自己总是守护在那里,我行我素,死板的按自己那一套循规蹈矩的重复工作的进程。它于外界是脱离的,不接受外界的信息也不反馈信息给外界。总在后台工作。从系统起动那一刻开始,直到关闭系统结束,其间,不受人干涉。它唯一接受的明令就是它设计时候规定要扑捉的信号。  
     
  2.在子进程中,也就是守护进程中调用setsid()函数创建新会话会话。什么是会话呢?就好比一个多兵种的综合性师,它有炮团,空降大队,坦克团,信息大队,步兵团,快艇大队。虽然各兵种没什么关系,但是,可以在师部的统一领导下协调作战。会话就是师部,而各负其责的进程组就是各兵种单位。师部只要向个兵种组下明令就行了而不关心每个士兵之间的协调。那么,setsid的作用是:如果调用进程不是一个进程组的领导进程的话,它就创立一个新会话,让调用进程成为新会话的会话领导。它同样让调用进程成为新进程组的进程领导,同时,它把进程组ID(PGID)和会话ID(SID)设置为调用进程的进程ID。最后,它消除新进程与任何终端的关联。为看为还是用通俗的语句来解释一下:如果有一个坦克兵认为自己很牛,可以当师长。这个时候他怎么做呢?他如果他不时坦克团团长,他就自己建立一个师,自任师长。并且,自己任命自己为这个新师下面坦克团的团长,随后,他把师和团的番号都用自己的军号命名,(因为他以后还要招兵买马),最后把隔断一切与以前的关系(就象台湾一样,推行‘去中国化’)最后宣布独立。于是,一个新的师产生了。 
     
  3.让根目录成为守护进程的工作目录。大家知道,GNUlinux 和UNIX类操作系统(文件系统是挂接上去的。卸载的时候是以游历目录树的方式卸载的。如果守护进程工作在这些挂结的文件系统上,并且,又蛮不讲理,不理会别人的任何行动。那么,文件就卸不下来。所以,只能运行在根目录/下。
      
  4.守护进程是革忘恩负义,大逆不道的家伙。他由父进程用fork()创造,一旦生出来就隔断与他老爹的关系。大家知道的,父亲生出的儿子,儿子很多地方象他老子,这一点我们叫做继承。是的,守护进程是被他老子fork()出来的自然继承了他老子的那一套。所以,要脱离父子关系就必须隔断这写继承,而自立门户,所以,我们在建立守护进程的时候,不管他父亲的umask是多少,我们都应该人它的变为0.为什么要设为0呢?因为,如果守护进程创建文件的话,可以自由设定他的权限而不是受制于他父亲的默认值!umask就是他们的权限。另外呢,子进程会继承父进程的文件描述符,这地球人都知道。但是,既然下定决心做守护进程,那么,这些都要关闭,不能拉拉撤撤。起码最基本的三个无论如何要关调:STDIN,STDOUT,STDERR,至于那些打开的配置文加,就要看情况了!
      
      #include
      #include
      #include
      #include
      #include
      #include
      #include
      #include
      
      int main(void)
      {
      pid_t sid,pid;
      char buff[]="Hello,linux, this is a process !";
      int len,fd;
      if (pid=fork()<0)
      {
      perror(fork);
      exit(EXIT_FAILURE)
      }
      if (pid >0)
      exit(0(;
      if (sid=setsid() < 0)
      {
      perror(setid);
      exit(EXIT_FAILURE);
      }
      
      if ((chdir("/"))<0)
      {
      perror(chdir);
      exit(EXIT_FAILURE);
      }
      umask(0);
      
      close(STDIN);
      close(STDOUT);
      close(STDERR);
      
      while(1)
      {
      len=sizeof(buff);
      if (fd=open("/var/log/crazydragon.log",O_CREAT|O_WRONLY| O_APEND,0644)<0)
      {
      perror(open);
      exit(EXIT_FAULURE);
      }
      write(fd, buff,len+1);
      close(fd);
      sleep(60);
      }
      exit(EXIT_SUCCESS);
      }
  以上是一个最简单的守护进程的实例。它的除了每分钟向/var/log/crazydragon.log中写一次‘hello,linux, this is a process"外什么都干不了,另外也不接受任何信号除了kernerl的SIGKILL.但是,它具备了以上讲的守护进程的几点基本原则。

阅读(1266) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~