C++ 的 exec
函数族用于在当前进程中执行新的程序。当你在一个 C++ 程序中使用 exec
时,当前进程的代码、数据、堆和栈都会被新的程序替换。这意味着在新程序启动后,原来的程序将不再运行,因此也无法处理信号。
如果你需要在新的程序中处理信号,你可以在调用 exec
之前设置信号处理函数。但是,请注意,当 exec
函数执行时,原来的信号处理函数将被替换为新程序的信号处理函数。因此,你需要确保在新程序中重新设置所需的信号处理函数。
以下是一个简单的示例,展示了如何在 C++ 中使用 exec
函数族处理信号:
#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <execvp.h>
void signalHandler(int sig) {
std::cout << "Signal " << sig << " caught" << std::endl;
}
int main() {
// 设置信号处理函数
signal(SIGINT, signalHandler);
std::cout << "Original process ID: " << getpid() << std::endl;
// 使用 execvp 执行新程序
char* argv[] = {"sleep", "30", nullptr};
execvp(argv[0], argv);
// 如果 execvp 失败,输出错误信息
perror("execvp");
return 1;
}
在这个示例中,我们首先设置了一个信号处理函数 signalHandler
,用于处理 SIGINT
信号(通常由用户按下 Ctrl+C 触发)。然后,我们使用 execvp
函数执行一个新的程序(在这个例子中是 sleep 30
,它将睡眠 30 秒)。当新程序启动后,原来的程序将不再运行,因此也无法处理信号。但是,新程序将继承父进程的信号处理函数设置。