unix-daemonize()

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <signal.h>
#include <syslog.h>
#include <fcntl.h>
#include <sys/resource.h>


int i;


void daemonize(const char *cmd){
int i,fd0,fd1,fd2;
pid_t pid;
struct rlimit r1;
struct sigaction sa;

umask(0);

if(getrlimit(RLIMIT_NOFILE,&r1)<0)
perror("getrlimit()");

if((pid = fork())<0)
perror("fork()[1]");
else if(pid != 0)
exit(0);
setsid();


printf("%d\n",i++);
sa.sa_handler = SIG_IGN;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
if(sigaction(SIGHUP,&sa,NULL) < 0)
perror("sigaction()");


if((pid = fork())<0)
perror("fork()[2]");
else if(pid != 0)
exit(0);


printf("%d\n",i++);

printf("%ld\n",(long)getpid());
if(chdir("/") < 0)
perror("chdir()");

if(r1.rlim_max == RLIM_INFINITY)
r1.rlim_max = 1024;
for(i = 0;i < r1.rlim_max;i++)
close(i);

fd0 = open("/dev/null",O_RDWR);
fd1 = dup(0);
fd2 = dup(0);

printf("%d\n",i++);
openlog(cmd,LOG_CONS,LOG_DAEMON);
if(fd0 != 0 || fd1 != 1 || fd2 != 2){
syslog(LOG_ERR,"unexpect file descriptors %d %d %d",fd0,fd1,fd2);
exit(1);


}
printf("%d\nENDING\n",i++);
}


int main(){
i = 1;
daemonize("hello");
pause();
printf("OMG!\n");
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值