守护进程实例
守护进程(Daemon)是一种运行在后台的一种特殊的进程,它独立于控制终端并且周期性的 执行某种任务或等待处理某些发生的事件。由于在linux中,每个系统与用户进行交流的界面成为终端,每一个从此终端开始运行的进程都会依附于这个终端, 这个终端被称为这些进程的控制终端,当控制终端被关闭的时候,相应的进程都会自动关闭。但是守护进程却能突破这种限制,它脱离于终端并且在后台运行,并且 它脱离终端的目的是为了避免进程在运行的过程中的信息在任何终端中显示并且进程也不会被任何终端所产生的终端信息所打断。它从被执行的时候开始运转,知道 整个系统关闭才退出(当然可以认为的杀死相应的守护进程)。如果想让某个进程不因为用户或中断或其他变化而影响,那么就必须把这个进程变成一个守护进程。
上代码:
1 #include<stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <fcntl.h> 5 #include <sys/types.h> 6 #include <unistd.h> 7 #include <sys/wait.h> 8 9 #define MAXFILE 65535 10 11 int main() 12 { 13 pid_t pc; 14 int i,fd,len; 15 char *buf="this is a dameon \n"; 16 len = strlen(buf); 17 pc =fork(); //(1)创建一个进程用来做守护进程 18 if(pc<0) 19 { 20 printf("error fork \n"); 21 exit(1); 22 } 23 else if(pc>0) 24 { 25 exit(0); //结束父进程 26 } 27 printf("守护进程已运行\n"); 28 setsid(); //(2)使子进程独立1.摆脱原会话控制 2.摆脱原进程组的控制 3.摆脱控制中端的控制 29 chdir("/tmp/"); //(3)改变当前工作目录,这也是为了摆脱父进程的影响 30 umask(0); //(4)重设文件权限掩码 31 for(i=0;i<MAXFILE;i++) //(5)关闭文件描述符(常说的输入,输出,报错3个文件), 32 { //因为守护进程要失去了对所属的控制终端的联系,这三个文件要关闭 33 close(i); 34 } 35 char num = 'A'; 36 while(1) 37 { 38 if((fd=open("/tmp/dameon.txt",O_CREAT|O_WRONLY|O_APPEND,0600))<0) 39 { 40 printf("open file err \n"); 41 exit(0); 42 } 43 write(fd,buf,len+1); 44 write(fd,&num,1); 45 num++; 46 close(fd); 47 sleep(2); 48 } 49 }
运行结果: