标签:
例子:
public class DaemonThreadTest { public static void main(String[] args){ Thread t1 = new MyThread(); Thread t2 = new Thread( new MyDaemon() ); t2.setDaemon(true); t1.start(); t2.start(); } } class MyDaemon implements Runnable{ public void run(){ for( long i=0; i<9999999L; i++ ) System.out.println("后台线程第" + i + "次执行!"); try{ Thread.sleep(7); }catch(InterruptedException e){ e.printStackTrace(); } } } class MyThread extends Thread{ public void run(){ for( int i=0; i<5; i++ ) System.out.println("线程第" + i + "次执行!"); try{ Thread.sleep( 7 ); }catch( InterruptedException e ){ e.printStackTrace(); } } }
输出:
后台线程第0次执行!
线程第0次执行!
后台线程第1次执行!
线程第1次执行!
后台线程第2次执行!
线程第2次执行!
后台线程第3次执行!
线程第3次执行!
后台线程第4次执行!
...
后台线程第339次执行!
即前台线程保证执行完毕,后台线程不一定。
signal(SIGTERM, sigterm_handler); void sigterm_handler(int arg) { _running = 0; }
创建守护进程的一个实例:
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<fcntl.h> #include<sys/types.h> #include<unistd.h> #include<sys/wait.h> #define MAXFILE 65535 void sigterm_handler(int arg); volatile sig_atomic_t _running = 1; int main() { pid_t pc,pid; int i,fd,len,flag = 1; char *buf="this is a Dameon\n"; len = strlen(buf); pc = fork(); //第一步 if(pc<0){ printf("error fork\n"); exit(1); } else if(pc>0) exit(0); pid = setsid(); //第二步[1] if (pid < 0) perror("setsid error"); chdir("/"); //第三步 umask(0); //第四步 for(i=0;i<MAXFILE;i++) //第五步 close(i); signal(SIGTERM, sigterm_handler); while( _running ) { if( flag ==1 &&(fd=open("/tmp/daemon.log",O_CREAT|O_WRONLY|O_APPEND,0600))<0) { perror("open"); flag=0; exit(1); } write(fd,buf,len); close(fd); usleep(10*1000); //10毫秒 } } void sigterm_handler(int arg) { _running = 0; }
标签:
原文地址:http://www.cnblogs.com/hf-cherish/p/4645890.html