用C语言写一个守护进程的代码,守护两个程序,当任意一个程序死掉的时候,可以自动拉起被守护的程序
时间: 2024-04-30 13:18:18 浏览: 96
c#实现的守护进程,包含代码
以下是一个简单的用C语言编写的守护进程代码,它可以守护两个程序,当任意一个程序死掉的时候,可以自动拉起被守护的程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
void start_daemon()
{
pid_t pid, sid;
// fork出子进程,并退出父进程
pid = fork();
if (pid < 0) {
exit(EXIT_FAILURE);
}
if (pid > 0) {
exit(EXIT_SUCCESS);
}
// 创建新会话,使子进程成为新的会话组长和进程组长
sid = setsid();
if (sid < 0) {
exit(EXIT_FAILURE);
}
// 修改工作目录,关闭文件描述符
if ((chdir("/")) < 0) {
exit(EXIT_FAILURE);
}
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
}
void start_process(const char *cmd, int *pid)
{
pid_t child_pid;
if ((child_pid = fork()) == -1) {
perror("fork error");
exit(EXIT_FAILURE);
}
if (child_pid == 0) {
// 子进程执行指定命令
execlp(cmd, cmd, NULL);
perror("execlp error");
exit(EXIT_FAILURE);
} else {
// 父进程记录子进程的pid
*pid = child_pid;
}
}
int main(int argc, char **argv)
{
// 检查参数数量
if (argc < 3) {
printf("Usage: %s <process1> <process2>\n", argv[0]);
exit(EXIT_FAILURE);
}
// 将进程变成守护进程
start_daemon();
int pid1 = 0, pid2 = 0;
// 启动第一个进程
start_process(argv[1], &pid1);
printf("%s started with pid %d\n", argv[1], pid1);
// 启动第二个进程
start_process(argv[2], &pid2);
printf("%s started with pid %d\n", argv[2], pid2);
// 循环监测两个进程的状态
while (1) {
int status1, status2;
// 检查第一个进程的状态
if (waitpid(pid1, &status1, WNOHANG) == pid1) {
printf("%s with pid %d exited with status %d, restarting...\n", argv[1], pid1, status1);
start_process(argv[1], &pid1);
printf("%s started with pid %d\n", argv[1], pid1);
}
// 检查第二个进程的状态
if (waitpid(pid2, &status2, WNOHANG) == pid2) {
printf("%s with pid %d exited with status %d, restarting...\n", argv[2], pid2, status2);
start_process(argv[2], &pid2);
printf("%s started with pid %d\n", argv[2], pid2);
}
// 休眠一段时间
sleep(10);
}
return 0;
}
```
这个守护进程代码的主要思路是:
1. 将进程变成守护进程,即将进程fork出子进程,并创建新会话,然后修改工作目录,关闭文件描述符,以脱离终端和父进程的控制。
2. 启动两个被守护的进程,并记录它们的pid。
3. 循环监测两个进程的状态,如果任意一个进程死掉了,就重新启动它。在循环中,使用waitpid函数来检查进程的状态,如果进程状态改变了,waitpid函数会返回该进程的pid。使用WNOHANG选项可以使waitpid函数立即返回,而不是一直等待,这样可以避免阻塞守护进程的运行。
4. 在守护进程的循环中,每次检查完两个进程的状态后,都休眠一段时间,以避免守护进程的CPU占用率过高。
当你编译并运行这个代码时,你需要提供两个被守护的进程的名称作为命令行参数。例如,你可以这样运行它:
```
./daemon process1 process2
```
其中,process1和process2是你要守护的两个进程的名称。注意,这两个进程需要在系统的PATH环境变量中可执行。
阅读全文