要求:自己动手实现一个守护进程,当控制台窗口关闭时还可以在后台运行,每隔一秒钟向my.log文件中插入一条记录,记录格式如下:yyyy-mm-dd hh:mi:se 。
//makefile
.SUFFIXES: .c .o
CC=gcc
SRCS=mydaemon.c
OBJS=$(SRCS:.c=.o)
EXEC=mydaemon
all: $(OBJS)
$(CC) -o $(EXEC) $(OBJS)
@echo '-------------ok--------------'
.c.o:
$(CC) -g -o $@ -c $<
clean:
rm -f $(OBJS)
rm -f core*
//mydaemon.c
#include
#include
#include
#include
#include
#include
void writelog(const char *log)
{
time_t tDate;
struct tm *eventTime;
time(&tDate);//得到系统时间
eventTime = localtime(&tDate);//将时间格式化为struct tm结构
int iYear = eventTime->tm_year + 1900;
int iMon = eventTime->tm_mon + 1;
int iDay = eventTime->tm_mday;
int iHour = eventTime->tm_hour;
int iMin = eventTime->tm_min;
int iSec = eventTime->tm_sec;
char sDate[16];
sprintf(sDate, "%04d-%02d-%02d", iYear, iMon, iDay);
char sTime[16];
sprintf(sTime, "%02d:%02d:%02d", iHour, iMin, iSec);
char s[1024];
sprintf(s, "%s %s [%s]\n", sDate, sTime, log);//将s格式化为yyyy-mm-dd hh:mi:se [x]
FILE *fd = fopen("my.log", "a+");//以追加的方式打开文件
fputs(s, fd);//想log文件中写入一条数据
fclose(fd);//关闭文件
}
void setdaemon()
{
pid_t pid, sid;
pid = fork();
if (pid < 0)
{
printf("fork failed\n");
exit(0);
}
if (pid > 0)//parent
{
exit(0);
}
if ((sid = setsid()) < 0)
{
printf("setsid failed\n");
exit(0);
}
}
int main(int arg, char *args[])
{
setdaemon();
char buf[100];
int i = 0;
while (1)
{
memset(buf, 0, sizeof(buf));
sprintf(buf, "log %d", i++);
writelog(buf);
sleep(1);
}
return 0;
}
//shell
#! /bin/sh
WHOAMI=`whoami`
PID=`ps -u $WHOAMI | gerp mydaemond | awk '{print $1}'`
if (test "$1" = "") then
echo "mydaemond [start][stop][version]"
exit 0
fi
if ( test "$1" = "status") then
if ( test "$PID" = "") then
echo "not run"
else
echo "is running"
fi
exit 0
fi
if (test "$1" = "start") then
if (test "$PID" = "") then
./mydaemond
fi
exit 0
fi
if (test "$1" = "stop") then
if (test "$PID" = "") then
kill $PID
fi
exit 0
fi