ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-08-30 03:06:43  阅读:290  来源: 互联网

标签:c fork pipe ipc chromium-embedded


我试图在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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有