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
相关文章读者评论发表评论 |