标签: libuv

使用libuv捕获子进程的stdout

我正在使用libuv.我已经阅读了http://nikhilm.github.com/uvbook/processes.html但仍然无法弄清楚如何捕获子进程的stdout以便它在父进程中可用(但不能代替父进程的stdin) ).

我的代码目前是:

#include <stdio.h>
#include <stdlib.h>
#include "../../libuv/include/uv.h"

uv_loop_t *loop;
uv_process_t child_req;
uv_process_options_t options;
uv_pipe_t apipe;

void on_child_exit(uv_process_t *req, int exit_status, int term_signal) {
    fprintf(stderr, "Process exited with status %d, signal %d\n", exit_status, term_signal);
    uv_close((uv_handle_t*) req, NULL);
}

uv_buf_t alloc_buffer(uv_handle_t *handle, size_t len) {
    printf("alloc_buffer called\n");
    uv_buf_t buf;
    buf.base = malloc(len);
    buf.len = len;
    return buf;
}

void read_apipe(uv_stream_t* stream, ssize_t nread, uv_buf_t buf) {
    printf("read %li bytes from the child process\n", nread);
}

int main(int argc, …
Run Code Online (Sandbox Code Playgroud)

c spawn libuv

9
推荐指数
2
解决办法
2576
查看次数

如何在nodejs插件中抽取窗口消息?

在Windows nodejs插件中,我创建了一个用于接收消息的窗口.

Handle<Value> MakeMessageWindow(const Arguments &args) { // exposed to JS
    ...
    CreateWindow(L"ClassName", NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, 0, 0, 0);
    ...
}
Run Code Online (Sandbox Code Playgroud)

我有一个wndproc函数.

Local<Function> wndProc;
LRESULT APIENTRY WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    // pack up the arguments into Local<Value> argv
    wndProc->Call(Context::GetCurrent()->Global(), 3, argv);
}
Run Code Online (Sandbox Code Playgroud)

现在我需要抽取消息.通常,你会做类似的事情

MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) 
{
     TranslateMessage(&msg);
     DispatchMessage(&msg);
}
Run Code Online (Sandbox Code Playgroud)

...但这不起作用,因为它只会阻止v8事件循环.

如何以不阻止v8的方式提取Windows消息,并允许我在窗口收到消息时调用JS函数?

我假设libuv将扮演一个角色,但我不确定如何安全地从C运行在一个单独的线程上调用JS函数,特别是因为uv_async_send不保证每次调用它时都会调用一个回调,我需要确保每次收到窗口消息时都会调用我的JS回调.

c++ winapi v8 node.js libuv

9
推荐指数
1
解决办法
1514
查看次数

UV_RUN_NOWAIT模式如何在libuv中工作?

使用该uv_run函数在libuv中运行事件循环时,会出现一个与以下值一起使用的"mode"参数:

UV_RUN_DEFAULT
UV_RUN_ONCE
UV_RUN_NOWAIT
Run Code Online (Sandbox Code Playgroud)

前两个是显而易见的.UV_RUN_DEFAULT运行事件循环,直到没有更多事件,并UV_RUN_ONCE处理循环中的单个事件.但是,UV_RUN_NOWAIT似乎不是一个单独的模式,而是一个可以与其他两个值之一进行OR运算的标志.

默认情况下,此函数会阻塞,直到事件完成处理,并UV_RUN_NOWAIT使其无阻塞,但我可以在其上找到的任何文档都在那里结束.我的问题是,如果你运行事件循环非阻塞,如何处理回调?

libuv事件模型是单线程的(reactor模式),所以我假设它需要阻塞才能调用回调,但如果主线程被占用,事件处理后会发生什么?在libuv再次控制主线程之前,回调是否会"排队"?或者是否会在另一个线程上调度回调?

c nonblocking evented-io libuv

8
推荐指数
1
解决办法
4314
查看次数

.pipe()是否在node.js中执行memcpy?

这是关于系统级优化的概念性查询.通过阅读NodeJS文档,我的理解是管道可以方便地对流进行流量控制.

背景:我有麦克风流进来,我想避免额外的复制操作,以节省整体系统MIPS.据我所知,对于音频流来说,即使在引擎盖下有记忆镜,也不会花费大量的MIPS,但我也计划在30fps和UHD分辨率下以相机帧流式传输.以30fps制作UHD分辨率像素数据的多个副本是非常低效的,因此需要一些关于此的建议.

示例代码:

var spawn = require('child_process').spawn
var PassThrough = require('stream').PassThrough;

var ps = null;
//var audioStream = new PassThrough;
//var infoStream = new PassThrough;

var start = function() {
    if(ps == null) {
        ps = spawn('rec', ['-b', 16, '--endian', 'little', '-c', 1, '-r', 16000, '-e', 'signed-integer', '-t', 'raw', '-']);
        //ps.stdout.pipe(audioStream);
        //ps.stderr.pipe(infoStream);
        exports.audioStream = ps.stdout;
        exports.infoStream = ps.stderr;
    }
};

var stop = function() {
    if(ps) {
        ps.kill();
        ps = null;
    }
};

//exports.audioStream = audioStream;
//exports.infoStream = infoStream;
exports.startCapture …
Run Code Online (Sandbox Code Playgroud)

v8 pipe node.js libuv

8
推荐指数
1
解决办法
327
查看次数

事件循环,libuv和v8引擎之间的关系

我正在学习Node.js的体系结构。我有以下问题。

  1. 事件循环是libuv还是v8的一部分?
  2. 事件队列是事件循环的一部分吗?是由libuv或v8引擎或事件循环本身生成的事件队列?
  3. libuv和v8引擎之间有什么联系?
  4. 如果事件循环是单线程的,libuv是否会出现在视图中以创建多个线程来处理文件I / O?
  5. 浏览器是否具有事件循环机制或仅Node.js具有?

javascript v8 node.js libuv

8
推荐指数
2
解决办法
1323
查看次数

mmorpg服务器端的网络库(libuv/boost :: asio?)

我目前正在重写一个非常古老的mmorpg的服务器端,我正在寻找一个好的开源网络库与C/C++一起使用.

由于客户端已经存在,我不能使用任何强制执行某种数据包结构或通信的库(例如,RakNet).

服务器将主要在三个不同的端口上使用UDP.

在网上搜索后,我发现了boost :: asio和libuv.

boost :: asio看起来像是一个成熟的选项,因为我已经使用了boost,但是我读到他们的UDP实现有点差,而且由于使用了一些锁定它无法实现多核处理器的最大性能epoll的.

libuv似乎很棒,是事件驱动的,由一个大项目支持,但目前没有这样的项目使用它,所以我对使用它有疑问.

你觉得怎么样?我可以在这样的项目中使用libuv,还是我必须使用boost :: asio?我也对其他建议持开放态度(他们需要跨平台,我已经放弃了enet,libevent和libev).

c++ boost network-programming boost-asio libuv

7
推荐指数
1
解决办法
5025
查看次数

libuv工作线程或工作队列健康检查?

在libuv中,最终可能会因为工作量太大或代码错误而将工作线程占用.是否有一个简单的函数可以检查工作线程或线程队列的运行状况?它不一定是100%确定性的,毕竟不可能确定工作线程是挂在慢速代码还是无限循环上.

因此,以下任何启发式方法都会很好:

  • 尚未处理的排队项目数.如果这个太大,则可能意味着工作线程忙或挂.

  • libuv是否有任何线程查杀机制,如果工作线程在n秒内没有检查,它会被终止吗?

c++ events multithreading node.js libuv

7
推荐指数
1
解决办法
940
查看次数

Node Js 是否使用 libuv 线程池进行网络 I/O

我在学习Node.js

\n\n

我在 libuv 官方文档中找到了这个注释 -

\n\n

\xe2\x80\x9clibuv使用 athread pool使asynchronous file I/O操作成为可能,但是network I/O始终在单个线程中执行,每个循环\xe2\x80\x99s 线程。\xe2\x80\x9d

\n\n

我的问题是针对以下声明(来自非官方资源)-

\n\n
\n

“如今\xe2\x80\x99s操作系统已经为许多I/O任务提供了异步接口(例如Linux上的AIO)。只要有可能,libuv就会使用这些异步接口,从而避免使用线程池。”

\n
\n\n

-- 此语句对于异步是否正确file I/O operations,或者仅适用于Network I/O

\n\n
    \n
  1. 意味着如果有文件 I/O 操作,那么在这种情况下将强制使用线程池,或者 libuv 将使用那些异步接口,避免使用线程池?
  2. \n
  3. Libuv 是否使用线程池进行网络 I/O ?
  4. \n
\n

node.js libuv

7
推荐指数
2
解决办法
2304
查看次数

*non-blockingness* 的 libuv 实现究竟是如何工作的?

所以我刚刚发现就 C 库而言,libuv是一个相当小的库(与 FFmpeg 相比)。在过去的 6 个小时里,我通读了源代码,以便更深入地了解事件循环。但仍然没有看到“非阻塞”在哪里实现。在代码库中调用某些事件中断信号或诸如此类的东西。

我已经使用 Node.js 超过 8 年了,所以我熟悉如何使用异步非阻塞事件循环,但我从未真正研究过它的实现。

我的问题是双重的:

  1. 恰恰是“循环” libuv内出现?
  2. 循环的每次迭代中使非阻塞异步的关键步骤是什么。

因此,我们从一个 hello world 示例开始。所有需要的是:

#include <stdio.h>
#include <stdlib.h>
#include <uv.h>

int main() {
  uv_loop_t *loop = malloc(sizeof(uv_loop_t));
  uv_loop_init(loop); // initialize datastructures.
  uv_run(loop, UV_RUN_DEFAULT); // infinite loop as long as queue is full?
  uv_loop_close(loop);
  free(loop);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我一直在探索的关键功能是uv_run. 该uv_loop_init函数本质上是初始化数据结构,所以我不认为那里有太多花哨的东西。但真正的魔力似乎有发生uv_run地方。来自 libuv 存储库的一组高级代码片段在此 gist 中,显示了uv_run函数调用的内容。 …

c io asynchronous event-loop libuv

7
推荐指数
2
解决办法
721
查看次数

在Node.js事件循环中获取(活动)计时器的计数

有没有办法在Node.js中调用以确定事件循环队列中的定时器数量?我有一个带有大量超时的图书馆,而不是使用某种内部簿记系统自己跟踪它们,如果我可以问V8或Libuv或其他什么,有多少计时器,这将是很好的.

这可能吗?

javascript v8 settimeout node.js libuv

6
推荐指数
1
解决办法
484
查看次数