#include #include #include #include #include #include #include #include #include void func(int no); //用作回调函数,给 signal() 调用 int main(int argc, char *argv[]) { pid_t pid = fork(); if (pid > 0) { _exit(1); //父进程退出 } else if (pid == 0) { setsid(); //子进程创建为会话 chdir("/Users/muli/Desktop/"); //改变进程的工作目录 umask(0); //重设置文件掩码 close(STDIN_FILENO); //关闭和终端的联系,文件描述符 close(STDOUT_FILENO); close(STDERR_FILENO); __sigaction_u sigactu; //设置信号捕捉 sigactu.__sa_handler = func; struct sigaction act; act.sa_flags = 0; act.__sigaction_u = sigactu; sigaddset(&act.sa_mask, SIGQUIT); itimerval time; //设置周期性的定时器 time.it_value.tv_sec = 2; time.it_value.tv_usec = 0; time.it_interval.tv_sec = 1; time.it_interval.tv_usec = 0; sigaction(SIGVTALRM, &act, NULL); //捕捉(下面一行发射的)信号,在 fun() 里面实现 setitimer(ITIMER_VIRTUAL, &time, NULL); //使用定时器,发射信号 while (true); //保持该守护进程不死亡 } return 0; } void func(int no) { time_t currtime; //获取系统当前时间,传出参数 time(&currtime); char* ptr = ctime(&currtime); int fd = open("/Users/muli/Desktop/setsid.txt", O_CREAT | O_WRONLY | O_APPEND, 0777); //写入磁盘文件 write(fd, ptr, sizeof(ptr) + 1); close(fd); }