/* *功能:建立一個守護進程,監視系統全部運行的進程 *時間:2013.4.14 */ #include <unistd.h> #include <signal.h> #include <sys/types.h> #include <sys/stat.h> #include <stdio.h> #include <stdlib.h> #include <sys/resource.h> //建立一個守護進程 void init() { int pid; int i; struct rlimit rl; //獲取進程資源西限制 if (getrlimit(RLIMIT_NOFILE, &rl) < 0) //獲取進程最多文件數 printf(":can't get file limit"); if(pid = fork()) exit(0); //父進程,退出 else if(pid < 0) //開闢進程失敗,退出並關閉全部進程 exit(1); /* 子進程繼續執行 */ setsid(); //建立新的會話組,子進程成爲組長,並與控制終端分離 /* 防止子進程(組長)獲取控制終端 */ if(pid = fork()) exit(0); //父進程,退出 else if(pid < 0) exit(1); //開闢進程失敗,退出並關閉全部進程 /* 第二子進程繼續執行 , 第二子進程再也不是會會話組組長*/ /* 關閉打開的文件描述符*/ if (rl.rlim_max == RLIM_INFINITY) //RLIM_INFINITY是一個無窮量的限制 rl.rlim_max = 1024; for (i = 0; i < rl.rlim_max; i++) close(i); chdir("/tmp"); // 切換工做目錄 umask(0); // 重設文件建立掩碼 return; } int main() { FILE *fp; FILE *fstream; signal(SIGCHLD, SIG_IGN); // 忽略子進程結束信號,防止出現殭屍進程 init(); //初始化守護進程,就是建立一個守護進程 while(1) { /*PID 進程ID ,user:進程開闢用戶,comm:進程名,lstart:進程開始時間,etime:進程持續時間*/ fstream=popen("ps -eo pid,user,comm,lstart,etime>test.txt","r"); //若是執行命令失敗,則寫入錯誤報告 if(fstream==NULL) { //在打開或者建立error.log成功的狀況下,寫入錯誤(使用errno時失敗) if((fp = fopen("error.log", "a+")) != NULL) { fprintf(fp, "%s\n", "執行命令失敗"); fclose(fp); } else exit(1); //寫入錯誤失敗,則終止程序推出並關閉全部進程 } else pclose(fstream); //關閉popen打開的I/O流 sleep(120); //設置成5分鐘獲取一次系統進程狀況 } return 0; }