自己动手实现一个守护进程,当控制台窗口关闭时还可以在后台运行。每隔一秒钟向my.log文件中插入一条记录

本文介绍了一个简单的守护进程实现方法,该守护进程能够在后台运行并在指定的日志文件中每秒写入一条记录。通过创建子进程并将其设置为后台进程组的领导者,实现了与控制台窗口的脱离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自己动手实现一个守护进程,当控制台窗口关闭时还可以在后台运行。每隔一秒钟向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;
}


在Java中,你可以使用`java.util.Timer`类来创建一个简单的计器。以下是一个示例程序,它会每秒更新并打印当前的间: ```java import java.util.Calendar; import java.util.Timer; import java.util.TimerTask; public class TimerExample { private static final int TIMER_INTERVAL = 1000; // 每隔1秒 public static void main(String[] args) { Timer timer = new Timer(); // 创建一个器 TimerTask task = new TimerTask() { // 定义任务 @Override public void run() { updateAndPrintTime(); } }; // 每隔1秒执行一次task timer.scheduleAtFixedRate(task, 0, TIMER_INTERVAL); // 第一次执行立即,后续固定间隔执行 try { // 让主线程等待一段间,以便观察计器的效果 Thread.sleep(60 * TIMER_INTERVAL); // 睡眠60秒 } catch (InterruptedException e) { e.printStackTrace(); } // 关闭器,防止内存泄漏 timer.cancel(); } private static void updateAndPrintTime() { Calendar calendar = Calendar.getInstance(); System.out.println("当前间:" + String.format("%02d:%02d:%02d", calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND))); } } ``` 在这个程序中,我们首先创建了一个`Timer`对象,并设置了`TimerTask`,它会定期调用`updateAndPrintTime()`方法。这个方法获取当前的间并格式化为"hh:mm:ss"的形式。`scheduleAtFixedRate()`方法用于启动计任务,然后我们在`main`方法中等待一定间,让计运行起来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值