自己动手实现一个守护进程,当控制台窗口关闭时还可以在后台运行。每隔一秒钟向my.log文件中插入一条记录,记录格式如下:yyyy-mm-dd hh:mi:se 记录内容,其中yyyy为年,mm为月,dd为天,hh为小时,mi为分钟, se为秒。
void writelog(const char *log)
{
time_t tDate;
struct tm *eventTime;
time(&tDate);
eventTime = localtime(&tDate);
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 sData[16];
sprintf(sData, "%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"-> sData, sTime, log);
FILE *fd = fopen("my.log", "a+");
fput(s, fd);
fclose(fd);
}
void setdaemon()
{
pid_t pid, sid;
pid = fork();
if (pid < 0)
{
exit(EXIT_FAILURE);
}
if (pid > 0)
{
exit(EXIT_SUCCESS);
}
if ((sid = setsid()) < 0)
{
printf("setsid failed %s\n", strerror(errno));
exit(EXIT_FAILURE);
/*chdir("/");
umask(0);
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);*/
}
}
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 EXIT_SUCCESS;
}