簡體   English   中英

fork 和 execve 應用其中一些與 condition_variable 和其他同時進行

[英]fork and execve applications some of them in order with condition_variable and the others simultaneously

我正在嘗試使用 fork() 和 execve() 執行多個應用程序。 他們中的一些人相互依賴。 因此,例如,當場景如下所示時,我想讓它同時執行 A、B、C,並讓它等到 B 處於“正在運行”狀態,然后再執行 C。

applications
A
B-C   (C depends on B)
D

在第一時間。 我想出了非常原始的解決方案,如下所示。 fork 並執行 app 並等待其狀態變為運行狀態。 (應用程序具有初始狀態並且一切准備就緒,它向 state_mgr 發送處於運行狀態的消息)

// app_starter.cpp
CreateAppProcess(...) {
   ...
   child = fork();
   ...
   if (child == 0) {
      execve(name, argv, argc);
      ...
   }
   ...
}


StartApplication(AppInstance& app) {
...
    CreateAppProcess(app->name, app->argv, app->argc);
...
}

以這種方式使用函數“StartApplication()”。

//app_starter.cpp

// 1. declare AppInstance array.
AppInstance app_array[10];  
// 2. set AppInstances in the array.
...
// 3. start apps
for (int i = 0 ; i < 10; i++) {
   StartApplication(app_array[i]);
}

// 4. wait until "execve"d app is on Running state.
for (int i = 0; i < 1000000000; i++) 
{
    return_value = app_ins.GetAppState(app->name);
    if(return_value == State::Running) break;
}

上述解決方案存在三個問題。

  1. 它一次只能執行一個應用程序。
  2. 應該等到前一個應用程序處於“運行”狀態,即使它不是依賴項。
  3. for 循環不斷消耗重復執行 GetAppState() 的資源。

所以我試圖一個一個地解決問題,但我堅持第一個解決方案 3。-condition_variable。

// app_instance.cpp
std::condition_variable g_app_cv;
std::mutex g_app_cv_mtx;
...
ReceiveAppStateMsg() {
    while(_quit) {
        ret_ = mq_receive(rcv_handler, buffer, size_, 0);
        ...
        if (msg_rcvd == State::Running) {
            ...
            g_app_cv.notify_one();
        }
    }
}

//app_starter.cpp
extern std::condition_variable g_app_cv;
extern std::mutex g_app_cv_mtx;

// 1. declare AppInstance array.
AppInstance app_array[10];  
// 2. set AppInstances in the array.
...
// 3. start apps  - change for loop to condition_variable.
for (int i = 0 ; i < 10; i++) {
   StartApplication(app_array[i]);
}

// 4. wait until "execve"d app is on Running state.
{
    std::unique_lock<std::mutex> lk(g_app_cv_mtx);
    g_app_cv.wait_for(lk, std::chrono::milliseconds(1000));
}

總之,我需要一些關於……的見解

  1. 如何在多個 cpp 文件中使用 condition_variable。

  2. 使用 std::condition_variable 的正確方法 fork() 和 exec()。

    • 想知道我的解決方案是正確的。
  3. 如何同時或沒有太多延遲地 fork() 和 exec() 。

execution order timeline I want
start --- |end
--------------
 A----|
  B----|C----|
   D----|
--------------

感謝您閱讀這么長的問題。

您需要在進程之間的共享內存區域中分配互斥鎖和條件變量。 您還需要將互斥鎖和 cond 變量的屬性設置為 PTHREAD_PROCESS_SHARED

如何共享內存: 鏈接

但是,出於與您類似的目的,我更願意編寫一個小型進程生命周期模塊(使用域套接字完全構建在 IPC 之上)。 您可以將流程的生命周期划分為:INIT、RUNNING、ALIVE、STOPPED、DEAD(基於您想要做什么,我只是給您提供線索)。 一旦您的流程達到其生命周期的某個階段,您就可以發布一個通知相同的事件。 另一個進程可以只是坐着等待在協作進程中實現該狀態。 一個簡單的心跳機制可以確定另一個進程是活着還是死了。 其他階段可以通過在 IPC 上發布來通知(首選域套接字)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM