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 秒)。當新程序啟動后,原來的程序將不再運行,因此也無法處理信號。但是,新程序將繼承父進程的信號處理函數設置。