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