1. 程式人生 > >寫一個守護程序+cpu佔用率在20%波動的程式

寫一個守護程序+cpu佔用率在20%波動的程式

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/