标签: interprocess

如何从AIR程序加载AIR运行时作为进程内共享库

我想在C语言中沿着java.exe构建一个特殊的AIR启动程序.

我已经看过使用进程查看器运行AIR程序,并且能够找到正在使用的AIR运行时DLL.AIR程序与Java不同之处在于它们作为特定于平台的可执行文件安装,这些可执行文件一旦启动就将AIR运行时绑定为进程内共享库(用户双击它们的图标).

好吧,我想制作一个类似java.exe的AIR启动器.

java.exe作为平台OS进程启动,该进程作为进程内共享库绑定到Java JVM运行时(JRE).要执行的java应用程序被指定为java.exe的命令行参数.一旦java.exe运行并且JVM完全正常运行,JVM类加载器就会加载指定的java应用程序类以供执行.然后,指定的Java应用程序接管,从某种意义上说"劫持"java.exe的进程.当然,指定的java应用程序在任何进程列表中显示为托管它的java.exe程序.

我想让AIR应用程序启动这样的工作.为什么?因此,我可以探索破解AIR的方法,并可能克服其中的许多不足之处.例如,对于初学者,我想使用一些可用于正在运行的AIR应用程序的新API来扩展AIR运行时体验.

我的第一笔业务是:

  • 实现ActionScript3到C的绑定接口,该接口与.NET PInvoke相当
  • 添加用于进程启动的API,与用于执行此操作的Java SE中的API相当(Runtime.exec,ProcessBuilder,Process)
  • 添加对AIR应用程序的支持,以便能够与stdin,stdout,stderr进行交互.奇怪的是,尽管Adobe在AIR中添加了对本地文件访问的支持,但他们忽略了与这些标准文件管道的交互(但它们可以在AIR支持的任何OS平台上找到).
  • 通过stdin,stdout,stderr实现对AMF的支持 - 因此AIR(或Java或任何支持AMF的语言)应用程序可以通过交换AMF对象来进行通信间处理.这将为AIR添加一点微软的PowerShell.

目前Merapi提供了一个带有Java的AMF桥,因此证明了它的功效.唉,Merapi必须使用localhost端口和套接字来进行进程间通信 - 相对于使用stdin/stdout/stderr进程间管道而言,这是一种笨拙的方式.

air pinvoke java-native-interface amf interprocess

5
推荐指数
0
解决办法
1273
查看次数

我应该监控哪些进程间锁定调用?

我正在使用strace/ 监视进程,ltrace希望找到并拦截一个检查并可能激活某种全局共享锁的调用.

虽然我以前曾经在Linux上处理过几种形式的进程间锁定,但我还是要查找要查找的内容.

目前我唯一的嫌疑是futex()在流程执行过程中很早就出现了.

Update0

关于我追求的是什么有一些混乱.我正在监视现有进程以调用持久进程间内存或等效内存.我想知道要查找的系统和库调用.我无意自称这些,所以很自然地futex()会出现,我相信很多图书馆都会根据这个来实现他们的锁定调用等.

UPDATE1

我想要一个函数名列表或文档链接,我应该在ltracestrace级别监视(并指定哪个).关于如何跟踪和定位全局锁定的任何其他好建议都会很棒.

linux locking interprocess strace ltrace

5
推荐指数
1
解决办法
1280
查看次数

使用套接字进行进程间通信的限制是什么?

我正在创建一个Firefox扩展,允许在Firefox中使用Standard ML(SML)作为客户端编程语言.它的工作方式如下:

  1. 该扩展启动了PolyML进程(具有顶级交互式shell的SML编译器).
  2. 然后在扩展和PolyML过程之间建立套接字通信.
  3. 从网页读取SML代码,并通过套接字发送到PolyML流程进行评估.
  4. 然后,该代码可以使用我提供的库来处理DOM.

以下是DOM库的实现方式:

  1. 假设有人执行SML函数DOM.getElementById
  2. 此请求通过套接字转发到扩展,扩展在页面上执行JavaScript函数getElementById,并通过套接字将结果发送回PolyML进程.

我的问题是,理论上,在套接字通信方面,我应该期待在性能方面有什么限制?

我做了一些非常近似的分析,似乎在扩展和PolyML之间使用这个接口,我可以大约发送2500条消息/秒,平均大小为70字节/消息.

为了说明这一点,我想在浏览器中使用Canvas元素绘制一些动画.如果我想达到20fps,这意味着我需要在0.05秒内绘制每一帧,这意味着我每帧只能发送大约125条消息.这些消息对应于JavaScript函数调用.例如,下面的代码绘制一个路径并进行9次JavaScript函数调用,这些调用对应于套接字通信中的9条消息.

val _ = Canvas.beginPath context;
val _ = Canvas.setFillStyle context fillColor;
val _ = Canvas.setStrokeStyle context fillColor;
val _ = Canvas.setLineWidth context size;
val _ = Canvas.moveTo context posx posy;
val _ = Canvas.lineTo context posx_new posy_new;
val _ = Canvas.stroke context;
val _ = Canvas.arc context posx_new posy_new (size/2.0) 0.0 6.28 true;
val _ = Canvas.fill context;
Run Code Online (Sandbox Code Playgroud)

显然,JavaScript有更好的性能,我想你可以在0.05秒内完成数千(数百)次Canvas/DOM函数调用,用于绘制帧.

所以,我想我的问题是,您是否有使用套接字通信进行非常快速的消息交换的经验.我想知道2500条小信息/秒(在这种情况下,相当于150千字节/秒)是否正确或者我可能做错了什么.

例如,有人怀疑firefox中的套接字实现(特别是通过JavaScript接口https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIServerSocket使用它)对于这种快速交互并不是很好.例如,从套接字读取是通过事件循环机制完成的.那就是我依靠Firefox ..来通知我有关传入套接字消息的可用性,有时在发送消息和接收它之间有一个很大的(例如250ms)延迟(虽然这似乎只有在firefox忙于做的时候才会发生其他的事情,我对套接字通信的理论限制更感兴趣 …

sockets firefox sml firefox-addon interprocess

5
推荐指数
1
解决办法
1213
查看次数

如何将代码(本例中为一个类)发送到服务器/程序并接收输出

情况如下:

我有一个庞大的数据集,我需要快速访问.这是一个财务数据集,所以基本上它的设置方式是,在每个时间点,你有数千个股票的数据.现在,将这些数据加载到程序中需要一段时间(20-40秒),我希望每次在代码中进行更改时都不必这样做.

基本上,我有一个想法,我想知道它是否有意义/是否是最佳的.我正在考虑设置某种加载了所有数据的服务器和所有对象定义,然后从第二个程序/客户端,我想向服务器发送一个预定义类型的类(策略类),让服务器运行代码,然后让服务器向我发回测试结果.

我在这种情况下创建交易策略,所以我有一个抽象类来定义"策略"需要什么.我有一个市场模拟器,每当日期变化时调用派生的"策略",然后策略购买或卖出股票,然后将策略的利润存储在某些结果对象中.所以我希望能够对策略部分进行编码,发送它并接收结果部分.我想避免每次更改策略对象中的params或原始代码时加载所有数据.

我希望这对某人有意义,如果不是很清楚,我很抱歉.如果可能,请告诉我,然后,我将如何进行Google搜索?我甚至不知道在这里搜索什么.

c# interprocess

5
推荐指数
1
解决办法
96
查看次数

是否可以在应用程序之间共享Cuda上下文?

我想在两个独立的Linux进程之间传递Cuda上下文(使用我已经设置的POSIX消息队列)。

使用cuCtxPopCurrent()cuCtxPushCurrent(),我可以获得上下文指针,但是在我调用该函数的进程的内存中引用了该指针,并且在进程之间传递它是没有意义的。

我正在寻找其他解决方案。到目前为止,我的想法是:

  1. 尝试深层复制该CUcontext结构,然后再传递副本。
  2. 看看我是否能找到一个共享内存解决方案,其中所有的Cuda指针都放在那里,以便两个进程都可以访问它们。
  3. 将流程合并到一个程序中。
  4. 我可能会切换到Cuda 4.0中更好的上下文共享。

我不确定选项(1)是否可行,也不确定(2)是否可用。(3)如果我想使事物通用(这是在劫持垫片中),则不是真正的选择。(4)我将看一下Cuda 4.0,但我不确定它是否也可以在那儿工作。

谢谢!

linux cuda gpu interprocess

5
推荐指数
1
解决办法
1340
查看次数

在ruby中有哪些可用的消息解决方案用于进程间通信?

我有一个使用delayed_job的rails应用程序.我需要我的工作相互沟通,例如"任务5完成"或"这是任务5需要处理的事项列表".

现在我有一个特殊的表,我总是访问事务中的表.它工作正常.我想为它构建一个更干净的api/dsl,但首先要检查是否已有解决方案.奇怪的是,我没有发现任何一件事,我要么谷歌搜索完全错误,要么任务如此简单(在事务中设置和获取值),没有人已经抽象出来了.

我错过了什么吗?

澄清:我不是在寻找一个新的排队系统,我正在寻找一种方法来让后台任务相互沟通.基本上只是安全地共享变量.以下框架是否提供此功能?延迟工作没有,这是一种耻辱.

用例: "并行完成这5项任务,然后当它们全部完成时,完成这1项最终任务." 因此,5个任务中的每个任务都会检查它是否是最后一个,如果是,它将触发最终任务.

ruby ruby-on-rails interprocess delayed-job

5
推荐指数
1
解决办法
1182
查看次数

通过管道进行进程间通信

众所周知,在Linux的进程间通信过程中,进程之间通过一个名为“Pipe”的特殊文件进行通信。

众所周知,对该文件执行的操作是由一个进程写入并由一个进程读取以相互通信。

现在,问题是:

这些写入读取操作是否在通信期间并行执行(操作并行执行)?如果不是,

当其中一个进程在通信期间进入SLEEP 状态时会发生什么?它是先执行操作让第二个进程读取还是直接进入睡眠状态而不执行任何写入读取操作?

linux operating-system ipc process interprocess

5
推荐指数
1
解决办法
1376
查看次数

python和c ++之间的进程间通信

我有一个python脚本来处理数据(作为更大框架的一部分),还有一个c ++脚本来从仪器中收集数据。C ++代码不断收集,然后通过cout发出数据。

这些程序需要互相交谈,例如:

  • Python->调用开始收集的c ++脚本
  • (等待x时间)
  • Python->向C ++脚本发送命令以停止收集和发射数据
  • c ++->接收命令并对其执行操作
  • Python->接收数据

我在最后一步中挣扎,我觉得打断是最好的方法,但我可能错了吗?这是我目前所拥有的:

(Python)

p = Popen("C++Script.exe", stdin=PIPE, stdout=PIPE, bufsize=1, shell=True)

# Wait for stuff to happen
# Send command to change read_flag to False in c++ script

for line in iter(p.stdout.readline, ''):
    line = str(line)  # Contains data to be parsed, obtained from cout
    # Do stuff..
Run Code Online (Sandbox Code Playgroud)

(C ++主)

...
BOOL read_flag = TRUE;
thread t1{ interrupt, &read_flag };

float Temp;
vector <float> OutData;

//Data read and stored …
Run Code Online (Sandbox Code Playgroud)

c++ python interprocess

5
推荐指数
0
解决办法
1207
查看次数

来自WM_COPYDATA消息的编组结构

我试图让一个C#WPF应用程序与使用WM_COPYDATA用C编写的另一个应用程序进行通信.C app正在尝试发送一个结构如下:

typedef struct
{
    int x;
    int y;
    char str[40];
    double d;
    char c;
} DATASTRUCT;
Run Code Online (Sandbox Code Playgroud)

在我的C#app中,我定义了一个结构如下:

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public struct DATASTRUCT
{
    public int x;
    public int y;
    [MarshalAs(UnmanagedType.LPStr, SizeConst=40)]
    public string s;
    public double d;
    public char c;
};
Run Code Online (Sandbox Code Playgroud)

接收WM_COPYDATA消息的代码如下:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    hwndSource = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle);
    hwndSource.AddHook(new HwndSourceHook(WndProc));
}

private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
    if (msg == 0x4A)
    {
        DATASTRUCT data = (DATASTRUCT)Marshal.PtrToStructure(lParam, …
Run Code Online (Sandbox Code Playgroud)

c c# struct marshalling interprocess

4
推荐指数
1
解决办法
5292
查看次数

为什么使用pipe()创建的管道不能用作双向管道?

几乎所有pipe我见过的例子都建议关闭未使用的写/读端.男人也清楚地说明了pipe() creates a pipe, a unidirectional data channel但是我已经尝试在父母和孩子的管道的两端读书和写作,一切似乎都没问题.

所以我怀疑为什么我们需要2个管道,如果两个进程必须相互读写,为什么不使用单个管道呢?

c ipc pipe interprocess

4
推荐指数
2
解决办法
3661
查看次数