linux中有一类运行在后台的进程,它们常驻内存,称为守护进程。实现该类进程的一个简单的方法是:父进程创建子进程后,子进程睡眠,父进程自我终止,使子进程成为守护进程daemon。编程实现这个daemon进程,要求在其执行期间输出其父进程的id号以及当前时间。(注:调用sleep()函数可以使进程睡眠,使daemon进程退出可以用键盘中断Ctrl+c)
时间: 2023-11-11 16:05:35 浏览: 35
下面是一个简单的 C 代码实现守护进程:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/stat.h>
#include <time.h>
void handler(int signum) {
printf("Daemon terminated.\n");
exit(0);
}
int main() {
pid_t pid = fork();
if (pid < 0) {
printf("Fork failed.\n");
exit(1);
}
if (pid > 0) {
printf("Parent process ID: %d\n", getpid());
exit(0);
}
umask(0); // 设置文件权限掩码为0
setsid(); // 创建新会话
chdir("/"); // 切换工作目录到根目录
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO); // 关闭标准输入输出错误流
signal(SIGINT, handler); // 注册信号处理函数
while(1) {
time_t now = time(NULL);
printf("Daemon process ID: %d, Current time: %s", getpid(), ctime(&now));
sleep(5);
}
return 0;
}
```
该程序中,父进程创建子进程后就退出,子进程成为守护进程。守护进程首先调用 `umask()` 函数将文件权限掩码设置为0,这样创建的文件权限将是最大的;然后调用 `setsid()` 函数创建新会话,并且成为该会话的首进程和组长进程,从而摆脱控制终端的控制,不受用户登录和注销等影响;接着调用 `chdir()` 函数将工作目录切换到根目录,释放当前目录的占用,避免卸载系统时当前目录所在的文件系统无法卸载;最后关闭标准输入、输出和错误流,并且注册一个信号处理函数,用于捕获用户的中断信号。在守护进程运行期间,每隔5秒钟输出一次当前时间和进程id。