一、守护进程
守护进程是后台运行的、系统启动是就存在的、不予任何终端关联的,用于处理一些系统级别任务的特殊进程。
二、实现代码
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <time.h>
#include <signal.h>
static int writeMessage(char *message) {
FILE *file = fopen("/pwx/test", "r+");
fprintf(file, "%s", message);
fclose(file);
}
static int daemonize() {
pid_t pid;
pid = fork();
if (pid < 0) {
writeMessage(strerror(errno));
return 1;
}
// 关闭父进程
if (pid > 0) {
writeMessage(strerror(errno));
_exit(0);
}
setsid();
pid = fork();
if (pid < 0) {
writeMessage(strerror(errno));
return 1;
}
// 关闭父进程
if (pid > 0) {
writeMessage(strerror(errno));
_exit(0);
}
// 进入 '/' 目录
if (chdir("/") < 0) {
writeMessage(strerror(errno));
return 1;
}
// 关闭标准输入、标准输出、错误输出
if (close(STDIN_FILENO)
|| close(STDOUT_FILENO)
|| close(STDERR_FILENO)) {
writeMessage(strerror(errno));
return 1;
}
/* 忽略信号 */
if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) {}
if (signal(SIGCHLD, SIG_IGN) == SIG_ERR) {}
return 0;
}
int main() {
// 创建一个守护进程
daemonize();
// 每秒钟记录一次时间
FILE *file = fopen("/pwx/time.log", "w+");
time_t t;
while (1) {
fseek(file, 0, SEEK_END);
sleep(1);
fprintf(file, "%s", asctime(&t));
}
}
三、相关函数
函数 | 描述 |
---|---|
void syslog(int priority, const chat *message, …); | 位于:<syslog.h>; 功能:记录系统日志。 |
void openlog(const char *ident, int options, int facility); | 位于:<syslog.h>; 功能:。 |
void closelog(void); | 位于:<syslog.h>; 功能:关闭系统日志文件流; 返回:成功返回非空指针,出错返回-1。 |