在C++中,exec函數用于在當前進程中執行另一個程序
#include <iostream>
#include <string>
#include <vector>
#include <unistd.h>
#include <sys/wait.h>
int main() {
std::string command = "ls -l"; // 示例命令:列出當前目錄下的所有文件及其詳細信息
std::vector<char*> args = {nullptr}; // 初始化參數數組
// 將命令字符串拆分為參數數組
char* token = strtok(command.c_str(), " ");
while (token != nullptr) {
args.push_back(token);
token = strtok(nullptr, " ");
}
args.push_back(nullptr); // 添加空指針以表示參數數組的結束
// 使用exec函數執行命令
pid_t pid = fork();
if (pid == 0) { // 子進程
execvp(args[0], args.data()); // 執行命令
perror("execvp"); // 如果execvp失敗,打印錯誤信息
exit(EXIT_FAILURE); // 退出子進程
} else if (pid > 0) { // 父進程
int status;
waitpid(pid, &status, 0); // 等待子進程完成
if (WIFEXITED(status)) { // 如果子進程正常退出
std::cout << "子進程退出,退出碼:" << WEXITSTATUS(status) << std::endl;
} else { // 如果子進程異常退出
std::cerr << "子進程異常退出" << std::endl;
}
} else { // fork失敗
perror("fork"); // 打印錯誤信息
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
在這個示例中,我們使用fork()創建一個子進程,然后在子進程中使用execvp()執行命令。execvp()函數會替換當前進程的映像,因此子進程的輸出將被重定向到命令的輸出。父進程可以使用waitpid()等待子進程完成,并根據返回的狀態碼判斷子進程是否正常退出。