linux守護進程編程實例

/*
*功能:建立一個守護進程,監視系統全部運行的進程
*時間: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;
}
相關文章
相關標籤/搜索