溫馨提示×

Linux C++中多進程編程怎樣實現

小樊
37
2025-07-08 01:41:59
欄目: 編程語言

在Linux環境下使用C++進行多進程編程,通??梢酝ㄟ^以下幾種方式實現:

  1. 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;
    }
    
  2. 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;
    }
    
  3. 進程間通信(IPC): 多進程編程中,進程間通信是必不可少的。Linux提供了多種IPC機制,如管道(pipe)、命名管道(named pipe,FIFO)、信號(signal)、消息隊列(message queue)、共享內存(shared memory)和信號量(semaphore)等。

  4. 信號(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;
    }
    
  5. 線程(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;
    }
    
  6. 進程池(process pool): 進程池是一種管理一組工作進程的設計模式,用于異步執行任務。它可以提高性能,因為創建和銷毀進程的開銷很大。

在實際應用中,可能需要結合使用這些技術來實現復雜的多進程程序。例如,可以使用fork()創建子進程,然后使用管道或共享內存進行進程間通信,同時使用信號來處理進程間的同步事件。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女