【问题标题】:fork and execve applications some of them in order with condition_variable and the others simultaneouslyfork 和 execve 应用程序中的一些按顺序使用 condition_variable 和其他同时
【发布时间】:2020-06-18 22:06:25
【问题描述】:

我正在尝试使用 fork() 和 execve() 执行多个应用程序。 其中一些相互依赖。 例如,我想让它同时执行 A、B、C 并让它等到 B 是 当场景如下时,在执行 C 之前处于“正在运行”状态。

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

第一次。我想出了如下非常原始的解决方案。 fork 并执行应用程序并等待其状态变为运行状态。 (应用程序具有初始状态并且一切就绪,它发送消息 对 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。 - 条件变量。

// 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. fork() 和 exec() 与 std::condition_variable 的正确方法。

    • 想知道我的解决方案是正确的。
  3. 如何 fork() 和 exec() 同时或延迟不多。

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

感谢您阅读这么长的问题。

【问题讨论】:

    标签: c++ c++14 fork exec


    【解决方案1】:

    您需要在进程之间的共享内存区域中分配互斥锁和条件变量。您还需要将 mutex 和 cond vars 的属性设置为 PTHREAD_PROCESS_SHARED

    如何共享内存:link

    但是,出于与您类似的目的,我更愿意编写一个小型进程生命周期模块(完全建立在 IPC 之上,使用域套接字)。您可以将流程的生命周期划分为:INIT、RUNNING、ALIVE、STOPPED、DEAD(根据您想要做什么,我只是给您提供线索)。一旦您的流程到达其生命周期的某个阶段,您就可以发布一个事件来通知它。其他进程可以只是等待该状态在协作进程中实现。一个简单的心跳机制可以确定其他进程是 ALIVE 还是已死。其他阶段可以通过 IPC 发布来通知(首选域套接字)

    【讨论】:

      猜你喜欢
      • 2018-07-10
      • 2018-05-28
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-29
      相关资源
      最近更新 更多