ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

《Linux系统调用: daemon用法》

2019-08-22 10:04:28  阅读:340  来源: 互联网

标签:kernel daemon ppid log 用法 tm Linux include size


一、程序

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#include <fcntl.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/klog.h>

#define FALLBACK_KLOG_BUF_SHIFT 17  /* CONFIG_LOG_BUF_SHIFT in kernel */
#define FALLBACK_KLOG_BUF_LEN   (1 << FALLBACK_KLOG_BUF_SHIFT)

#define KLOG_CLOSE         0
#define KLOG_OPEN          1
#define KLOG_READ          2
#define KLOG_READ_ALL      3
#define KLOG_READ_CLEAR    4
#define KLOG_CLEAR         5
#define KLOG_CONSOLE_OFF   6
#define KLOG_CONSOLE_ON    7
#define KLOG_CONSOLE_LEVEL 8
#define KLOG_SIZE_UNREAD   9
#define KLOG_SIZE_BUFFER   10

/* we use 'Linux version' string instead of Oops in this lab */
//#define OOPS_LOG  "Oops" 
#define OOPS_LOG  "Linux version" 

int save_kernel_log(char *buffer)
{
	char path[128];
	time_t t;
	struct tm *tm;
	int fd;

	t = time(0);
	tm = localtime(&t);

	snprintf(path, 128, "/mnt/%d.%d.%d.%d.%d.%d.log", tm->tm_year+1900,
			tm->tm_mon+1, tm->tm_mday, tm->tm_hour,
			tm->tm_min, tm->tm_sec);
	printf("%s\n", path);
	
        fd = open(path, O_WRONLY|O_CREAT, 0644);
	if(fd == -1) {
		printf("open error\n");
		return -1;
	}
        write(fd, buffer, strlen(buffer));
        close(fd);

	return 0;
}

int check_kernel_log()
{
	char *buffer;
	char *p;
	ssize_t klog_size;
	int ret = -1;
	int size;

	printf("start kernel log\n");

	klog_size = klogctl(KLOG_SIZE_BUFFER, 0, 0);
	if (klog_size <= 0) {
		klog_size = FALLBACK_KLOG_BUF_LEN;
	}

	printf("kernel log size: %d\n", klog_size);

	buffer = malloc(klog_size + 1);
	if (!buffer)
		return -1;

	size = klogctl(KLOG_READ_ALL, buffer, klog_size);
	if (size < 0) {
		printf("klogctl read error\n");
		goto done;
	}

	buffer[size] = '\0';

	/* check if oops in klog */
	p = strstr(buffer,OOPS_LOG);
	if (p) {
		printf("we found '%s' on kernel log\n", OOPS_LOG);
		save_kernel_log(buffer);
		ret = 0;
	} 
done:
	free(buffer);
	return ret;
}

int main(void)
{
    printf("pid=%d , ppid = %d \n",getpid(),getppid());
	if(daemon(0,0) == -1) {   //看打印,if(daemon(0,1)
		printf("daemon error");
		return 0;
	}
	
    printf("pid=%d , ppid = %d \n",getpid(),getppid());
	while(1) {
		check_kernel_log();
		
		sleep(5);
	}
	
	return 0;
}

编译:arm-linux-gnueabi-gcc daemon_test.c -o daemon_test --static

运行:

/ # /mnt/daemon_test 
pid=820 , ppid = 773 
pid=821 , ppid = 820   // 也可能是ppid = 1 ,就看父进程消亡的时间
/ # pid=821 , ppid = 1 
start kernel log
kernel log size: 32768
we found 'Linux version' on kernel log
/mnt/2019.7.23.3.39.5.log
pid=821 , ppid = 1 
start kernel log
kernel log size: 32768
we found 'Linux version' on kernel log
/mnt/2019.7.23.3.39.10.log
pid=821 , ppid = 1 
start kernel log
kernel log size: 32768
we found 'Linux version' on kernel log
/mnt/2019.7.23.3.39.15.log

 

标签:kernel,daemon,ppid,log,用法,tm,Linux,include,size
来源: https://blog.csdn.net/yexiangCSDN/article/details/96978542

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有