0

我有以下后端功能:

// foo.c

void cStart(pid_t* pid)
{
  *pid = getpid();

  // event-loop keep running until receive SIGINT signal
}

void cStop(pid_t* pid)
{
  kill(*pid, SIGINT);
}
// addon.cpp

#include "addon.h"
#include "foo.h"

Napi::Number addon::run_pipeline_wrapped(const Napi::CallbackInfo &info)
{
  Napi::Env env = info.Env();

  // get the buffer from JS, pass it to cStart to be modified in-place [?]
  cStart(pid_t* pid);
}

Napi::Number addon::kill_pipeline_wrapped(const Napi::CallbackInfo &info)
{ 
  Napi::Env env = info.Env();

  // get the modified (by cStart) buffer from JS, pass it to cStop [?]
  cStop(pid_t* pid);
}

在前端,当点击开始按钮时,一个 C 进程将开始运行,直到它收到一个 SIGINT 信号,当点击停止按钮时,向正在运行的 C 进程发送 SIGINT 信号。int* 将按如下方式运行:JS(单击开始按钮)-> C/C++(cStart 已修改 int*,因此 int* 不会显式返回给 JS)-> JS(单击停止按钮)-> C/C++)。那么如何在 JS 和 C/C++ 之间来回传递一个 int 指针呢?

4

1 回答 1

1

您不必将指针传递给 JS。

您可以改用全局状态:

// foo.c

pid_t* my_pid;

void cStart(void)
{
  my_pid = getpid(); // save the pid

  // event-loop keep running until receive SIGINT signal
}

void cStop(void)
{
  // kill the process from earlier
  kill(*my_pid, SIGINT);
}

请注意,但是这假设您只有一个在调用cStart和调用之间没有被其他任何东西改变的情况cEnd。因此,cEnd它应该杀死start单击按钮的同一进程。

您的 C++ 代码将如下所示:

// addon.cpp

#include "addon.h"
#include "foo.h"

Napi::Number addon::run_pipeline_wrapped(const Napi::CallbackInfo &info)
{
  Napi::Env env = info.Env();
  cStart();
}

Napi::Number addon::kill_pipeline_wrapped(const Napi::CallbackInfo &info)
{ 
  Napi::Env env = info.Env();
  cStop();
}
于 2021-07-22T21:53:11.717 回答