铬嵌入框架(C++)和另一个二进制之间的IPC

IPC between chromium embedded framework (C++) and another binary

本文关键字:二进制 另一个 之间 IPC 框架 C++      更新时间:2023-10-16

我正在尝试在chromium嵌入式框架(C++)和另一个二进制文件之间启用一些基本的IPC。我基本上想从CEF启动子二进制文件,并通过管道进行通信。

CEF似乎不支持将我们自己的代码连接到已经存在的高级IPC。它似乎也不包含可用于在任意进程中启动外部二进制文件的功能。http://www.magpcss.org/ceforum/viewtopic.php?f=6&t=12715

我想我要找的是一个例子,你可以实际连接两个不同的二进制文件。

我需要将带有字符串和命令的消息传递到二进制文件。例如,这些命令和字符串将导致二进制init,使用cURL从url获取数据并销毁自身。

Soooo,考虑到这一点,我尝试使用一些基本的fork()、exec()、pipe()功能。我得到的印象是,这是相当低的水平。。。

更新:它们在windows上也不起作用,所以我转而考虑扩展/使用现有的CEF功能,请参阅底部

我需要根据一些状态来控制子进程,初始化和销毁,以及处理来自它的状态消息。

我已经成功地生成了一个二进制文件,下一步将是创建一些基本IPC。

这(fork()、exec()、pipe())是完成集成任务的合理方法吗CEF二进制与其他二进制?

//This codes fires of a binary, with some basic functionality in a separate process
printf("Parent PID %dn",getpid());
signal(SIGCHLD, SIG_IGN);
pid_t pid=fork();
if (pid==0) { /* child process */
NSString *processString= [[NSString stringWithFormat:@"p %d",getpid()] autorelease];
static char *argv[]={(char*)[processString UTF8String],/*(char*)"echo",(char*)"Foo is my name.",*/NULL};
//execv("/bin/ps",argv);
execv("/Users/thisUser/Library/Developer/Xcode/DerivedData/mychildbinary/Build/Products/Debug/mychildbinary",argv);
exit(127); /* only if execv fails */
}
else { /* pid!=0; parent process */
//waitpid(pid,0,0); /* wait for child to exit */
}

以下是一个编写和读取管道的基本程序:http://www.gnu.org/software/libc/manual/html_node/Creating-a-Pipe.html

更新:

由于fork(),pipe()不适用于跨平台。我已经写了一个LaunchExternalProcess方法,但我仍然缺乏IPC的功能,下面的代码从file_exe(二进制的完整路径)启动一个外部进程:

  // Test of process creation using CEF methods (static), might need to be moved.
  void ClientHandler::LaunchExternalProcess(CefString file_exe) {
    if (CefCurrentlyOn(TID_PROCESS_LAUNCHER)) {
      // Retrieve the current executable path.
      //CefString file_exe;
      //if (!CefGetPath(PK_FILE_EXE, file_exe))
      //  return;
      // Create the command line.
      CefRefPtr<CefCommandLine> command_line =
      CefCommandLine::CreateCommandLine();
      command_line->SetProgram(file_exe);
      //command_line->AppendSwitchWithValue(cefclient::kUrl, url);
      // Launch the process.
      CefLaunchProcess(command_line);
    } else {
      // Execute on the PROCESS_LAUNCHER thread.
      CefPostTask(TID_PROCESS_LAUNCHER,
                  NewCefRunnableFunction(&ClientHandler::LaunchExternalProcess, file_exe));
    }
  } 

关于这些过程之间的简单沟通,有什么线索可以提供吗?

我没有从LaunchExternalProcess方法中得到PID或任何东西。。。

我们在CEF过程和非CEF过程之间使用0mq进行IPC。

我们使用了一个简单的计时器来轮询0mq消息队列中要在CEF中调度的IPC消息,并正常运行CefRunMessageLoop()。这使我们能够在没有阻塞的情况下发送和接收0mq套接字,并且我们在发送/接收流量方面取得了出色的结果。

要将Chromium IPC与SendProcessMessage一起使用,进程必须由CEF本身派生(例如,当需要新的Renderer时)。我不认为您可以任意创建流程并向它们发送消息。

实现自己的IPC通信并不那么困难。我可以建议至少两个好的选择:

  • boost::进程间::message_queue
  • WebSocket++

WebSocket解决方案是我的最爱,因为您可以控制从同一网络中的任何web浏览器发送消息的过程(甚至从您的手机)。

相关文章: