专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »嵌入式开发 » linux守护进程: linux 守护程序 »正文

linux守护进程: linux 守护程序

来源: 发布时间:星期四, 2008年12月11日 浏览:26次 评论:0
 # <stdio.h>
T1pfbaiducukRj2# <stdlib.h>
T1pfbaiducukRj2# <unistd.h>
T1pfbaiducukRj2# <dirent.h>
T1pfbaiducukRj2# <errno.h>
T1pfbaiducukRj2# <fcntl.h>
T1pfbaiducukRj2# <ctype.h>
T1pfbaiducukRj2# <.h>
T1pfbaiducukRj2# <sys/ioctl.h>
T1pfbaiducukRj2# <sys/wait.h>
T1pfbaiducukRj2
T1pfbaiducukRj2# PROC_NAME     "mymail"
T1pfbaiducukRj2# EXEC_NAME     "/root/dev_mobile/source/MyMail/src/mymail"
T1pfbaiducukRj2#   LOCKFILE "/root/mytest.lock"
T1pfbaiducukRj2#  DEBUG
T1pfbaiducukRj2 daemon_init
T1pfbaiducukRj2{
T1pfbaiducukRj2    struct sigaction act;
T1pfbaiducukRj2     i, maxfd;
T1pfbaiducukRj2     lock_fd;
T1pfbaiducukRj2     ret;
T1pfbaiducukRj2    char buf[100];
T1pfbaiducukRj2    lock_fd=open(LOCKFILE,O_RDWR|O_CREAT,0640);
T1pfbaiducukRj2    (lock_fd<0){
T1pfbaiducukRj2        prf("lockfile failed :\n");
T1pfbaiducukRj2            exit(-1);
T1pfbaiducukRj2    }
T1pfbaiducukRj2    
T1pfbaiducukRj2    ret=flock(lock_fd,LOCK_EX|LOCK_NB);//下面关闭了,所以起不到作用
T1pfbaiducukRj2    (ret<0){
T1pfbaiducukRj2        prf("can't obtaion the file lock:\n");
T1pfbaiducukRj2        exit(0);
T1pfbaiducukRj2    }
T1pfbaiducukRj2    (fork != 0)
T1pfbaiducukRj2        exit(0);
T1pfbaiducukRj2   
T1pfbaiducukRj2    (sid < 0)
T1pfbaiducukRj2        -1;
T1pfbaiducukRj2    act.sa_handler = SIG_IGN;
T1pfbaiducukRj2    sigempty(&act.sa_mask);
T1pfbaiducukRj2    act.sa_flags = 0;
T1pfbaiducukRj2    sigaction(SIGHUP, &act, 0);
T1pfbaiducukRj2    (fork != 0)
T1pfbaiducukRj2        exit(0);
T1pfbaiducukRj2    chdir("/");
T1pfbaiducukRj2    umask(0);
T1pfbaiducukRj2    pgrp;
T1pfbaiducukRj2    maxfd = sysconf(_SC_OPEN_MAX);
T1pfbaiducukRj2    for (i = 0; i < maxfd; i)
T1pfbaiducukRj2        //close(i);
T1pfbaiducukRj2        ;
T1pfbaiducukRj2    sprf(buf,"%6d\n",getpid);
T1pfbaiducukRj2    write(lock_fd,buf,strlen(buf));   
T1pfbaiducukRj2    open("/dev/null", O_RDWR);
T1pfbaiducukRj2    dup(0);
T1pfbaiducukRj2    dup(1);
T1pfbaiducukRj2    dup(2);
T1pfbaiducukRj2    0;
T1pfbaiducukRj2}
T1pfbaiducukRj2 file2str(char *filename, char *ret, cap)
T1pfbaiducukRj2{
T1pfbaiducukRj2    fd, num_read;
T1pfbaiducukRj2
T1pfbaiducukRj2    ((fd = open(filename, O_RDONLY, 0)) -1)
T1pfbaiducukRj2        -1;
T1pfbaiducukRj2    ((num_read = read(fd, ret, cap - 1)) <= 0)
T1pfbaiducukRj2        -1;
T1pfbaiducukRj2    ret[num_read] = 0;
T1pfbaiducukRj2    close(fd);
T1pfbaiducukRj2    num_read;
T1pfbaiducukRj2}
T1pfbaiducukRj2
T1pfbaiducukRj2 parse_proc_status(char*p_name,char *S)
T1pfbaiducukRj2{
T1pfbaiducukRj2    char *tmp;
T1pfbaiducukRj2    unsigned char p_id[10];
T1pfbaiducukRj2    mem(p_id, 0x00, (p_id));
T1pfbaiducukRj2    sscanf(S, "Name:\t%15c", p_id);
T1pfbaiducukRj2    tmp = strchr(p_id, '\n');
T1pfbaiducukRj2    (tmp)
T1pfbaiducukRj2        *tmp = '\0';
T1pfbaiducukRj2    //prf("%s\n",p_id);
T1pfbaiducukRj2    (strcmp(p_name,p_id)0)
T1pfbaiducukRj2        0;
T1pfbaiducukRj2   
T1pfbaiducukRj2         -1;
T1pfbaiducukRj2    -1;
T1pfbaiducukRj2   
T1pfbaiducukRj2}
T1pfbaiducukRj2
T1pfbaiducukRj2 proc_exist(char *p_name)
T1pfbaiducukRj2{
T1pfbaiducukRj2  DIR *dir;
T1pfbaiducukRj2  FILE *file;
T1pfbaiducukRj2  struct dirent *entry;
T1pfbaiducukRj2  char path[32], sbuf[512];
T1pfbaiducukRj2  id;
T1pfbaiducukRj2    dir = opendir("/proc");
T1pfbaiducukRj2    (!dir){
T1pfbaiducukRj2        perror("Can't open /proc");
T1pfbaiducukRj2        exit(-1);
T1pfbaiducukRj2    }
T1pfbaiducukRj2        while ((entry = readdir(dir)) != NULL) {
T1pfbaiducukRj2        (!isdigit(*entry->d_name))
T1pfbaiducukRj2            continue;
T1pfbaiducukRj2        sprf(path, "/proc/%s/status", entry->d_name);
T1pfbaiducukRj2        ((file2str(path, sbuf, sbuf)) != -1) {
T1pfbaiducukRj2            (parse_proc_status(p_name,sbuf)0){
T1pfbaiducukRj2                id=atol(entry->d_name);
T1pfbaiducukRj2                prf("id=%d\n",id);
T1pfbaiducukRj2                closedir(dir);
T1pfbaiducukRj2                0;
T1pfbaiducukRj2            }
T1pfbaiducukRj2               
T1pfbaiducukRj2        }
T1pfbaiducukRj2    }
T1pfbaiducukRj2closedir(dir);
T1pfbaiducukRj2 -1;
T1pfbaiducukRj2}
T1pfbaiducukRj2
T1pfbaiducukRj2 proc_fork(char*p_path)
T1pfbaiducukRj2{
T1pfbaiducukRj2 char * argv[ ]={PROC_NAME,(char*)0 };
T1pfbaiducukRj2 pid_t pid;
T1pfbaiducukRj2 pid=fork;
T1pfbaiducukRj2 (pid0){
T1pfbaiducukRj2 execv(p_path,argv);
T1pfbaiducukRj2 }
T1pfbaiducukRj2 (pid>0)
T1pfbaiducukRj2    prf("fork  succeed:\n");
T1pfbaiducukRj2}
T1pfbaiducukRj2
T1pfbaiducukRj2
T1pfbaiducukRj2void handler
T1pfbaiducukRj2{
T1pfbaiducukRj2  char uidName[30];
T1pfbaiducukRj2  char exec_path[50];
T1pfbaiducukRj2 
T1pfbaiducukRj2    mem(uidName,0x00,(uidName));
T1pfbaiducukRj2    mem(exec_path,0x00,(exec_path));
T1pfbaiducukRj2    strcpy(uidName,PROC_NAME);
T1pfbaiducukRj2    strcpy(exec_path,EXEC_NAME);
T1pfbaiducukRj2    prf("one\n");
T1pfbaiducukRj2    (proc_exist(uidName)0)
T1pfbaiducukRj2        prf("进程存在\n");
T1pfbaiducukRj2   
T1pfbaiducukRj2        proc_fork(exec_path);   
T1pfbaiducukRj2    alarm(10);
T1pfbaiducukRj2}
T1pfbaiducukRj2
T1pfbaiducukRj2 ( argc, char **argv)
T1pfbaiducukRj2{
T1pfbaiducukRj2#def DEBUG
T1pfbaiducukRj2   (daemon_init < 0) {
T1pfbaiducukRj2        prf("daemon failed\n");
T1pfbaiducukRj2        1;
T1pfbaiducukRj2    }
T1pfbaiducukRj2#end
T1pfbaiducukRj2   signal(SIGALRM,handler);
T1pfbaiducukRj2   alarm(15);
T1pfbaiducukRj2   while (1){
T1pfbaiducukRj2   while ( waitpid(-1,NULL,WNOHANG) > 0)
T1pfbaiducukRj2        prf("test:\n");
T1pfbaiducukRj2   }
T1pfbaiducukRj2}
T1pfbaiducukRj2
T1pfbaiducukRj2 网上unix比较多前几天做了个linux下监控某如果不存在就启动
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: