Chinaunix首页 | 论坛 | 博客
  • 博客访问: 405873
  • 博文数量: 48
  • 博客积分: 1820
  • 博客等级: 上尉
  • 技术积分: 705
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-28 23:10
文章分类

全部博文(48)

文章存档

2012年(1)

2011年(12)

2010年(34)

2009年(1)

分类: LINUX

2009-12-28 23:22:23

守护进程八股文
最近在做一个服务器,
每次启动的时候都要nohup xx.server >/dev/null & 
费事不说,实在太不专业了,
决定把它改成守护进程的方式启动,
守护进程的创建有其八股文,只要按照标准步骤一步步操作,
很容易就能实现。

再次特发此文, 总结一下守护进程的用法 。

守护进程是脱离于终端并且在后台运行的进程。守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程也不会被任何终端所产生的终端信息所打断。如关闭了终端或者连接的ssh终端断开连接,守护进程能够不受影响的运行,而在终端中建立的其他线程则会被杀死。

Linux系统有很多守护进程,大多数服务都是通过守护进程实现的

 创建一个守护进程八股文:
1、创建子进程,父进程退出
pid_t proc = fork() ;
if( proc <0){
     fprintf(stderr , "fork fail ....error:<%s>" ,
       strerror(errno) ) ;
     exit(1) ;
}
IF( proc ){
     exit(0);
}

fork 调用会有三种结果,负值表示出错, 正值表示成功,并表示运行到父进程, 0表示运行在子进程 。

二:关闭所有到文件描述符

这样服务器创建来一个副本来运行,在用户看来,程序一下子就运行完成了,其实服务器已经在后台运行着呢 。每个进程都有父进程,服务器的父进程提前退出那么Init进程自动成为其父进程, 子进程继承父进程到所有文件描述符,那么我们最好把所有到文件描述符关闭节省资源,
for( inti = getdtablesize()-1 ; i>=0; --i)
   (void)close(i);


三. 进程与控制终端脱离
主要是确保控制终端到信号不会影响 服务器进程。
int fd = open("/dev/tty", O_RDWR);
(void)ioctl(fd, TIOCNOTTY,0);
(void)close( fd ) ;
四:其他高级设置

一般而言服务器会在一个特定到目录下运行。
(void)chdir("/");
限制文件创建掩码
(void)umask(027);
服务器进程应该放在但多到进程组去,而不是隶属于其他进程组,
(void)setpgrp(0,getpid());
将标准输出文件转向黑洞文件
fd = open("/dev/null" , O_RDWR);3
(void)dup( fd );
(void)dup( fd )
五,更多高级设置
创建文件锁迫使一台机器上只能有一个副本 。
记录服务器到pid 。
屏蔽外来到信号,或者重新设置信号到操作,比如sighup
使用syslog 创建日志系统 。














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