★实验 8-2 1. 创建两个守候进程。每个守候进程各自创建独立的日志文件。 2. 每隔 1s 向日志文件中写入如下信息: a) 守候进程 1:未使用的内存大小(MemFree) b) 守

★实验 8-2   
1. 创建两个守候进程。每个守候进程各自创建独立的日志文件。
2. 每隔 1s 向日志文件中写入如下信息:  
a) 守候进程 1:未使用的内存大小(MemFree) 
b) 守候进程 2:在活跃使用中的缓冲或高速缓冲存储器页面文件的大小(Active) 可以从/proc/meminfo 获取 
3. 每隔 2s 通过日志守候进程 syslogd 向系统日志中写入以下内容: 
a) 进程名称 
b) 进程 ID 
c) 当前时间   

#include <unistd.h> 
#include <signal.h> 
#include <fcntl.h>
#include <sys/syslog.h>
#include <sys/param.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int init_daemon(const char *pname, int facility)
{ 
        int pid; 
        int i;
	     signal(SIGTTOU,SIG_IGN); 
	     signal(SIGTTIN,SIG_IGN); 
	     signal(SIGTSTP,SIG_IGN); 
	     signal(SIGHUP ,SIG_IGN);
 
        if(pid=fork()) 
            exit(EXIT_SUCCESS); 
        else if(pid< 0) 
	  {
		perror("fork");
		exit(EXIT_FAILURE);
        }
        setsid(); 
        if(pid=fork()) 
                exit(EXIT_SUCCESS); 
        else if(pid< 0) 
	  {
		perror("fork");
		exit(EXIT_FAILURE);
        }  
        for(i=0;i< NOFILE;++i)
                close(i);
         open("/dev/null", O_RDONLY);
          open("/dev/null", O_RDWR);
          open("/dev/null", O_RDWR);

        chdir("/tmp"); 
        umask(0);  
        signal(SIGCHLD,SIG_IGN);
	    openlog(pname, LOG_PID, facility);
	    return ; 
} 
float get_memfree()
{
      FILE* fp;
      char buffer[1024];
      size_t bytes_read;
      char* match;
      float memfree;

      fp = fopen ("/proc/meminfo", "r");
      bytes_read = fread (buffer, 1, sizeof (buffer), fp);
      fclose (fp);
      
      buffer[bytes_read] = '\0';
      match = strstr (buffer, "MemFree");
      if (match == NULL)
      return 0;
      sscanf (match, "MemFree : %f", &memfree); //读取
      return memfree;
}
float get_Active() 
{ 
      FILE* fp1; 
      char buffer1[1024]; 
      size_t bytes_read1; 
      char* match1; 
      float Active; 
       
      fp1 = fopen ("/proc/meminfo", "r"); 
      bytes_read1 = fread (buffer1, 1, sizeof (buffer1), fp1); 
      fclose (fp1);
      buffer1[bytes_read1] = '\0'; 
      match1 = strstr (buffer1, "Active");			
      if (match1 == NULL) 
      	return 0; 
      sscanf (match1, "Active : %f", &Active);	
      return Active; 
} 
int main(int argc,char *argv[])
{
    FILE *fp;
    FILE *fp1;
    time_t ticks;
    init_daemon(argv[0],LOG_KERN);
    while(1)
{
    sleep(2);
        syslog(LOG_INFO, "PID information, pid=%d", getpid());
        syslog(LOG_INFO, "PID information, name=%s",argv[0]);
        ticks=time(NULL);
        syslog(LOG_INFO, "%s", asctime(localtime(&ticks)));

    }

    while(1)
    {
        sleep(1);
        if((fp=fopen("print_memfree","a")) ==0)
        {
           fprintf (fp,"MemFree now is: %4.0f\n", get_memfree ());
           fclose(fp);
        }
        else if((fp1=fopen("print_Active","a")) >=0)
        {
           fprintf (fp1,"Active now is: %4.0f\n", get_Active ());
           fclose(fp1);
        }
}

    return;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值