写一个守护进程+cpu占用率在20%波动的程序

版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/derkampf/article/details/84140542

1.cpu占用率在20%波动的程序怎么写

//makecpu.c
void makeCpu()
{
    int time_start;
    int fulltime = 100;//总时间
    int runtime = 20;//运行时间
    while(1){
        time_start = clock();
        while((clock()-time_start)<runtime){}
        usleep(fulltime-runtime);
    }
}

2.守护进程 怎么写

//daemon.c
#include <stdio.h>
#include <stdlib.h>   // exit()
#include <unistd.h>   // fork() setsid() chdir() close()
#include <sys/types.h>    // fork() umask()
#include <sys/stat.h> // umask()
 
 
// 与终端无关,在后台默默运行的守护进程
void mydaemon(int ischdir,int isclose)
{
    // 调用setsid() 的不能是进程组组长,当前程序有可能是进程组组长
    pid_t pid = fork();
 
    // 非子进程则退出
    if(pid != 0)
        exit(-1);
 
    // 父进程退出,留下子进程
 
    // 创建一个新的会话期,从而脱离原有的会话期
    // 进程同时与控制终端脱离
    setsid();
 
    // 此时子进程成为新会话期的领导和新的进程组长
    // 但这样的身份可能会通过fcntl去获到终端
    pid = fork();
 
    // 非子进程则退出
    if(pid != 0)
        exit(-1);
 
    // 此时留下来的是孙子进程,再也不能获取终端
 
    // 通常来讲, 守护进程应该工作在一个系统永远不会删除的目录下
    if(ischdir == 0)
    {
        chdir("/");
    }
 
    // 关闭输入输出和错误流 (通过日志来查看状态)
    if(isclose == 0)
    {
        close(0);
        close(1);
        close(2);
    }
 
    //去掩码位
    umask((mode_t)0);//sys/stat.h
}
 
int main(int argc, char *argv[])
{
    mydaemon(1,1);
 
    while(1)
        ;
 
    exit(EXIT_SUCCESS);
}

3.融合在一起就达到了title的小目标

//CpuDaemon.c
#include <stdio.h>
#include <stdlib.h>   // exit()
#include <unistd.h>   // fork() setsid() chdir() close()
#include <sys/types.h>    // fork() umask()
#include <sys/stat.h> // umask()
 
void makeCpu()
{
    int time_start;
    int fulltime = 100;//总时间
    int runtime = 20;//运行时间
    while(1){
        time_start = clock();
        while((clock()-time_start)<runtime){}
        usleep(fulltime-runtime);
    }
}
// 与终端无关,在后台默默运行的守护进程
void mydaemon(int ischdir,int isclose)
{
    // 调用setsid() 的不能是进程组组长,当前程序有可能是进程组组长
    pid_t pid = fork();
 
    // 非子进程则退出
    if(pid != 0)
        exit(-1);
 
    // 父进程退出,留下子进程
 
    // 创建一个新的会话期,从而脱离原有的会话期
    // 进程同时与控制终端脱离
    setsid();
 
    // 此时子进程成为新会话期的领导和新的进程组长
    // 但这样的身份可能会通过fcntl去获到终端
    pid = fork();
 
    // 非子进程则退出
    if(pid != 0)
        exit(-1);
 
    // 此时留下来的是孙子进程,再也不能获取终端
 
    // 通常来讲, 守护进程应该工作在一个系统永远不会删除的目录下
    if(ischdir == 0)
    {
        chdir("/");
    }
 
    // 关闭输入输出和错误流 (通过日志来查看状态)
    if(isclose == 0)
    {
        close(0);
        close(1);
        close(2);
    }
 
    //去掩码位
    umask((mode_t)0);//sys/stat.h
}
 
int main(int argc, char *argv[])
{
    mydaemon(1,1);
 
    while(1)
    {
        makeCpu();
	}
 
    exit(EXIT_SUCCESS);
}

4.运行

gcc CpuDaemon.c -o CpuDaemon
./CpuDaemon

守护进程可参考 https://lellansin.wordpress.com/2013/04/20/linux-c-%E5%AE%88%E6%8A%A4%E8%BF%9B%E7%A8%8B/

猜你喜欢

转载自blog.csdn.net/derkampf/article/details/84140542