linux中有一类运行在后台的进程,它们常驻内存,称为守护进程。实现该类进程的一个简单的方法是:父进程创建子进程后,子进程睡眠,父进程自我终止,使子进程成为守护进程daemon。编程实现这个daemon进程,要求在其执行期间输出其父进程的id号以及当前时间。(注:调用sleep()函数可以使进程睡眠,使daemon进程退出可以用键盘中断Ctrl+c)
时间: 2024-02-27 10:52:08 浏览: 88
Linux中如何让进程在后台运行
可以使用Linux系统提供的fork()函数创建子进程,从而实现守护进程的创建,编写如下的程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>
void signal_handler(int signum) {
printf("Daemon process is terminated.\n");
exit(0);
}
int main() {
pid_t pid;
time_t t;
pid = fork();
if (pid < 0) {
printf("Failed to create daemon.\n");
exit(1);
} else if (pid > 0) {
printf("Parent process ID is %d.\n", getpid());
return 0;
}
printf("Child process ID is %d.\n", getpid());
// 创建新会话,使子进程成为守护进程
if (setsid() < 0) {
printf("Failed to create daemon.\n");
exit(1);
}
// 忽略终端信号,防止进程被终止
signal(SIGINT, SIG_IGN);
// 注册信号处理函数,以便在进程被终止时输出信息
signal(SIGTERM, signal_handler);
// 输出父进程ID和当前时间
printf("Parent process ID is %d.\n", getppid());
while (1) {
time(&t);
printf("Current time is %s", ctime(&t));
sleep(1);
}
return 0;
}
```
程序中首先使用fork()函数创建一个子进程pid,如果pid小于0,则说明创建进程失败;如果pid大于0,则说明当前进程是父进程,直接退出;否则说明当前进程是子进程,执行后续的创建守护进程的操作。
子进程首先调用setsid()函数创建新会话,使自己成为守护进程,并脱离终端。然后忽略终端信号,防止进程被终止。接着注册信号处理函数,以便在进程被终止时输出信息。最后进入一个死循环,输出父进程ID和当前时间,并睡眠1秒钟。
可以使用如下的命令编译和运行程序:
```bash
gcc -o daemon daemon.c
./daemon
```
程序将在后台运行,并输出父进程ID和当前时间。可以使用Ctrl+c组合键中断程序,观察输出信息。
阅读全文