铬嵌入框架(C++)和另一个二进制之间的IPC
IPC between chromium embedded framework (C++) and another binary
我正在尝试在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浏览器发送消息的过程(甚至从您的手机)。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 运行同一解决方案的另一个项目的项目
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何将包含另一个对象向量的对象保存到文件中,并使用C++中的二进制文件从文件中读回?
- 如何在标准c ++中流式传输/读取二进制文件的中间部分并写入另一个文件?
- 在 NDK 上编译两个带有 gradle 的项目,其中一个依赖于另一个的二进制文件
- C++:如何在线程中读取二进制文件并将其写入另一个线程?
- 从一个二进制文件中读取信息,并写入另一个二进制文件
- 如何从不同部分读取二进制文件的var?(例如,2个字节,另一个位置有2个字节?)
- BITWISE-如何检查二进制号是否包含另一个数字
- 将包含另一个向量的结构向量写入二进制文件
- 铬嵌入框架(C++)和另一个二进制之间的IPC
- 从一个二进制树复制到另一个
- GCC - 链接到另一个文件夹中的库有效,但二进制文件不会运行
- 找到与另一个二进制模式匹配的所有 2 位值,然后对它们求和
- 给出两个二进制数,将一个子集从一个复制到另一个
- C++用另一个二进制文件编辑二进制文件
- 找出(在c++中)二进制数是否是另一个二进制数的前缀
- 创建随机二进制字符串:如何在插入到另一个字符串之前从 to_string() 中删除空字符'