创建一个守护进程,然后使用fork创建子进程,之后kill子进程,让父进程可以通过信号感知子进程退出事件
时间: 2024-03-10 17:48:12 浏览: 91
(修改版)实现进程的软中断通信。要求:使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断
4星 · 用户满意度95%
好的,这是一个创建守护进程,使用 fork 创建子进程,之后 kill 子进程,让父进程可以通过信号感知子进程退出事件的 C++ 代码示例:
```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()` 函数创建新的会话,成为新的进程组组长,并与原来的控制终端脱离关系。然后关闭标准输入输出和错误输出,执行子进程任务。
如果要让父进程杀死子进程,可以使用 `kill()` 函数发送信号给子进程。例如,在父进程中添加以下代码:
```c++
kill(pid, SIGKILL);
```
其中,`pid` 是子进程的进程 ID,`SIGKILL` 是要发送的信号,表示杀死进程。当父进程执行到这行代码时,会向子进程发送 `SIGKILL` 信号,杀死子进程。
当子进程被杀死时,会发送 `SIGTERM` 信号给父进程,父进程也会调用注册的信号处理函数。在该函数中,可以添加一些代码来处理子进程被杀死的情况。例如,可以在函数中输出一条日志,告知用户子进程被杀死了。
阅读全文