要求:自己动手实现一个守护进程,当控制台窗口关闭时还可以在后台运行,每隔一秒钟向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 <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <signal.h> #include <time.h> 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