明天学这个!!
——————————————————————————————————————————————————————————
守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件,它不需要用户输入就能运行并提供某种服务。
守护进程的父进程是init进程,因为它真正的父进程在fork出子进程后就先于子进程exit退出了,所以它是一个由init继承的孤儿进程。守护进程是非交互式程序,没有控制终端,所以任何输出,无论是向标准输出设备还是标准错误输出设备的输出都需要特殊处理。
Linux系统有多种创建守护进程的方法,其中最常用的的是使用daemon()函数来创建守护进程:
int daemon(int nochdir , int noclose);
参数 nochdir 如果为零,那么daemon函数将调用进程的目录,设为根目录。否则原有的工作目录不变。
参数 noclose 如果为零,那么daemon将重新定义输入、输出标准。否则不变。
总得来说,守护进程就是一种运行在后台的进程,是无法在控制台直接操作的进程,至于功能,需要自己编写。
现在用daemon函数写个程序,运行之后,每过十秒钟,在一个指定的文件里面写上一句话。
进入编码模式……
#include<stdio.h> #include<errno.h> #include<stdlib.h> #include<unistd.h> #include<fcntl.h> #include<time.h> #include<string.h> char lab_now[]="现在的时间是:"; int main(void) { int fd; time_t curtime; if(daemon(0,0)<0) { printf("创建守护进程失败errno=%d. ",errno); exit(-1); } fd = open("/home/vmuser/work/daemon/daemon.txt",O_WRONLY|O_CREAT|O_APPEND,0x777); if (fd < 0) { printf("创建文件失败! "); exit(-1); } while(1) { curtime = time(0); char *timestr = asctime(localtime(&curtime)); strcat(lab_now,timestr); write(fd,lab_now,strlen(lab_now)); sleep(10); } return 0; }
花了半个小时,代码编写完毕,途中出现的几个小问题也修改完成!
现在开始做makefile:
EXE=daemon SRC=daemon.c OBJ=daemon.o cc=gcc CFLAG=-g LCDFLAG= EXE:$(OBJ) $(cc) $(LCDFLAG) $(SRC) -o $(EXE) OBJ:$(SRC) $(cc) -c $(SRC) -o $(OBJ) .PHONY:clean clean: rm -vfr $(OBJ) $(EXE) daemon.txt
执行编译……
在执行代码之前,文件结构是这样的:
在执行了代码后,文件结构变成了这样:
文件已经建立成功,虽然表面上看,什么也没有,但程序也应该是在后台运行了起来,查看daemon.txt文件,看看是否如自己预料的那般,每隔十秒就答应点信息。
答应的结果如下,很明显,自己的代码有问题。每次都把取得的时间接到lab_now字符串后面,那么这个字符串会无限的变大……哎,真是粗心啊!
——————————————————————————————————————————————
用了一个笨办法,将代码修改如下:
#include<stdio.h> #include<errno.h> #include<stdlib.h> #include<unistd.h> #include<fcntl.h> #include<time.h> #include<string.h> char lab_now[]="现在的时间是:"; int main(void) { int fd; time_t curtime; if(daemon(0,0)<0) { printf("创建守护进程失败errno=%d. ",errno); exit(-1); } fd = open("/home/vmuser/work/daemon/daemon.txt",O_WRONLY|O_CREAT|O_APPEND,0x777); if (fd < 0) { printf("创建文件失败! "); exit(-1); } while(1) { curtime = time(0); char *timestr = asctime(localtime(&curtime)); strcat(lab_now,timestr); write(fd,lab_now,strlen(lab_now)); strcpy(lab_now,"现在的时间是:"); sleep(10); } return 0; }
添加了将那个字符串lab_now赋值的处理,方法是有点笨,但现阶段是好用就行!
代码运行之后,显示结果如下……
显示结果正确,然后用ps -ef指令来查看一下:
确实,进程正在后台运行!
今天的作业完成!