#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后打印第二句,阻塞等待)