daemon.c
#include <unistd.h>
#include <signal.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <syslog.h>
void init_daemon(void)
{
int pid;
int i;
if(pid=fork())
exit(0);//是父進程,結束父進程
else if(pid< 0)
exit(1);//fork失敗,退出
//是第一子進程,後臺繼續執行
setsid();//第一子進程成爲新的會話組長和進程組長
//並與控制終端分離
if(pid=fork())
exit(0);//是第一子進程,結束第一子進程
else if(pid< 0)
exit(1);//fork失敗,退出
//是第二子進程,繼續
//第二子進程不再是會話組長
for(i=0;i< NOFILE;++i)//關閉打開的文件描述符
close(i);
//chdir("/tmp");//改變工作目錄到/tmp
umask(0);//重設文件創建掩模
return;
}
void sig_term(int signo)
{
if(signo==SIGTERM) /*catchedsignalsentbykill(1)command*/
{
syslog(LOG_INFO,"log4j-agent program terminated.");
closelog();
exit(0);
}
}
int main(int argn, char** argv)
{
extern int errno;
if (argn>1)
{
init_daemon();//初始化爲Daemon
openlog("log4j-agent", LOG_PID, LOG_USER);
syslog(LOG_INFO, "log4j-agent started.");
signal(SIGTERM,sig_term);/*arrangetocatchthesignal*/
char *p[argn + 1];
int j=0;
for(j=0; j<argn+1; j++){
p[j] = 0;
}
int i=1;
for(i=1; i<argn; i++){
p[i-1] = argv[i];
}
for(j=0; j<argn+1; j++){
printf("%s \n", p[j]);
}
int ret = execvp(argv[1], p);
if (ret<0){
//syslog(LOG_ERR, "execl failed:%s");
fprintf(stderr,"execl failed:%s", strerror(errno));
return -1;
}
}else{
printf("usage: ./daemon commond [argv] \n");
printf("su as: ./daemon java -jar log4j-agent.jar -f conf/log4j.xml -p 4561 \n");
}
}
build
gcc daemon.c -o daemon
Usage:
./daemon java -jar log4j-agent.jar -f conf/log4j.xml -p 4561
You can run any program you want int linux with this ‘daemon’.