c++实现创建一个守护进程,然后使用fork创建子进程,之后kill子进程,让父进程可以通过信号感知子进程退出事件
时间: 2024-03-10 17:48:11 浏览: 124
下面是一个简单的 C++ 示例代码,用于创建一个守护进程,使用 fork 创建子进程,通过信号感知子进程退出事件:
```c++
#include <unistd.h>
#include <signal.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <iostream>
// 子进程退出信号处理函数
void child_exit_handler(int signum) {
std::cout << "Child process exited." << std::endl;
}
int main() {
// 创建守护进程
pid_t pid = fork();
if (pid < 0) {
std::cerr << "Failed to fork." << std::endl;
return -1;
}
if (pid > 0) {
// 父进程
std::cout << "Daemon process started with PID " << pid << "." << std::endl;
// 等待子进程退出
signal(SIGCHLD, child_exit_handler);
pause();
std::cout << "Daemon process exited." << std::endl;
return 0;
}
// 子进程
umask(0);
// 创建新的会话
pid_t sid = setsid();
if (sid < 0) {
std::cerr << "Failed to create new session." << std::endl;
return -1;
}
// 关闭标准输入输出
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
// 执行子进程任务
while (true) {
std::cout << "Child process is running." << std::endl;
sleep(1);
}
return 0;
}
```
该代码中,首先使用 `fork()` 创建新的进程。如果返回值为负数,则表示创建进程失败;如果返回值为正数,则表示是父进程,需要等待子进程退出;如果返回值为 0,则表示是子进程,需要执行子进程任务。
在父进程中,使用 `signal()` 函数注册子进程退出信号处理函数,然后调用 `pause()` 函数使进程挂起,等待信号的到来。当子进程退出时,会发送 `SIGCHLD` 信号给父进程,父进程接收到信号后会调用注册的信号处理函数。
在子进程中,首先调用 `umask()` 函数设置文件权限掩码,然后调用 `setsid()` 函数创建新的会话,成为新的进程组组长,并与原来的控制终端脱离关系。然后关闭标准输入输出和错误输出,执行子进程任务。
阅读全文