守护进程-线程

 

 

 

 

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/time.h>
#include <time.h>
#define _FILE_NAME_FORMAT_ "%s/log/mydaemon.%ld"

void touchfile(int num){
    char* HomeDir=getenv("HOME");
    char filename[256]={0};
    sprintf(filename,_FILE_NAME_FORMAT_,HomeDir,time(NULL));
    int fd=open(filename,O_RDWR|O_CREAT,0666);

    if(fd<0){
        perror("open error!");
        exit(1);
    }
    close(fd);
}

int main()
{

    //创建子进程,父进程退出
    pid_t pid=fork();
    if(pid>0){
        exit(1);
    }
    //当会长
    setsid();
    //设置掩码
    umask(0);
    //切换目录
    chdir(getenv("HOME")); //
    //关闭文件描述符
    //执行核心逻辑
    struct itimerval myit={{60,0},{1,0}};
    setitimer(ITIMER_REAL,&myit,NULL);
    struct sigaction act;
    act.sa_flags=0;
    sigemptyset(&act.sa_mask);
    act.sa_handler=touchfile;
    sigaction(SIGALRM,&act,NULL);
    while(1){
        //每隔一分钟在/home/.../log下创建文件
        sleep(1);
    }
    //推出
    return 0;
}

 

 

如果不sleep,则进程退出,创建的线程无法执行。

可以用pthread_exit()退出一个线程

 

“I will be out”不会执行。exit整个进程都退出了。

 

 (5s后打印第二句,阻塞等待)

猜你喜欢

转载自www.cnblogs.com/FEIIEF/p/12919846.html