其他分享
首页 > 其他分享> > IPC嵌入式框架(C)和另一个二进制文件之间的IPC

IPC嵌入式框架(C)和另一个二进制文件之间的IPC

作者:互联网

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

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

我想我要找的是一个实际连接两个不同二进制文件的例子.

我需要将带有字符串和命令的消息传递给二进制文件.这些命令和字符串将导致二进制文件
init,来自url的getData使用cURL并自行销毁.

Soooo,看着这个我尝试使用一些基本的fork(),exec(),pipe()功能.
我得到的印象是这个水平相当低……

更新:它们也不能在Windows上工作,所以我已经切换到扩展/使用现有的CEF功能,见底部

我需要根据某些状态控制子进程,init和destroy以及处理来自它的状态消息.

我已设法产生二进制文件,下一步将创建一些
基本的IPC.

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

//This codes fires of a binary, with some basic functionality in a separate process

printf("Parent PID %d\n",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或任何东西……

解决方法:

我们使用0mq在我们的CEF流程和非cef流程之间进行了IPC.

我们使用一个简单的计时器来轮询0mq消息队列,以便在CEF中调度IPC消息并正常运行CefRunMessageLoop().这使我们可以同时发送和接收0mq套接字而不会阻塞,我们收到的流量大大优异.

标签:c,fork,pipe,ipc,chromium-embedded
来源: https://codeday.me/bug/20190830/1765400.html