在Linux環境下使用C++進行多進程編程,通??梢酝ㄟ^以下幾種方式實現:
fork()系統調用:
fork()
是Unix和類Unix系統(包括Linux)上用于創建新進程的系統調用。它創建一個與調用進程幾乎完全相同的子進程。
#include <sys/types.h>
#include <unistd.h>
#include <iostream>
int main() {
pid_t pid = fork();
if (pid == -1) {
// 錯誤處理
std::cerr << "fork failed" << std::endl;
return 1;
} else if (pid == 0) {
// 子進程
std::cout << "Child process, PID: " << getpid() << std::endl;
} else {
// 父進程
std::cout << "Parent process, PID: " << getpid() << ", Child PID: " << pid << std::endl;
}
return 0;
}
exec()系列函數:
exec()
系列函數用于在當前進程的上下文中加載并運行一個新的程序。通常與fork()
結合使用,以便在子進程中執行不同的程序。
#include <sys/types.h>
#include <unistd.h>
#include <iostream>
int main() {
pid_t pid = fork();
if (pid == -1) {
std::cerr << "fork failed" << std::endl;
return 1;
} else if (pid == 0) {
// 子進程
char *args[] = {"ls", "-l", NULL};
execvp(args[0], args);
// 如果execvp返回,則表示失敗
std::cerr << "execvp failed" << std::endl;
return 1;
} else {
// 父進程
// 等待子進程結束
wait(NULL);
}
return 0;
}
進程間通信(IPC): 多進程編程中,進程間通信是必不可少的。Linux提供了多種IPC機制,如管道(pipe)、命名管道(named pipe,FIFO)、信號(signal)、消息隊列(message queue)、共享內存(shared memory)和信號量(semaphore)等。
信號(signal): 信號是一種異步通信機制,用于通知接收進程某個事件已經發生。
#include <csignal>
#include <iostream>
void signalHandler(int signum) {
std::cout << "Interrupt signal (" << signum << ") received.\n";
}
int main() {
// 注冊信號SIGINT的處理函數
signal(SIGINT, signalHandler);
// 無限循環
while (true) {
// ...
}
return 0;
}
線程(threading): 雖然線程不是進程,但它們通常在多進程程序中使用,以提供并發性。C++11引入了標準線程庫,可以方便地創建和管理線程。
#include <thread>
#include <iostream>
void helloFunction() {
std::cout << "Hello from a thread!" << std::endl;
}
int main() {
// 創建一個線程
std::thread t(helloFunction);
// 等待線程完成
t.join();
return 0;
}
進程池(process pool): 進程池是一種管理一組工作進程的設計模式,用于異步執行任務。它可以提高性能,因為創建和銷毀進程的開銷很大。
在實際應用中,可能需要結合使用這些技術來實現復雜的多進程程序。例如,可以使用fork()
創建子進程,然后使用管道或共享內存進行進程間通信,同時使用信號來處理進程間的同步事件。