资讯专栏INFORMATION COLUMN

libuv 之《通过管道读取子进程数据》

layman / 1516人阅读

摘要:首先推荐一本的书我遇到的问题是,打开一个子进程,我想读取输出。这本书里面是没有提到的,我在找到了答案。

首先推荐一本 libuv 的书《An Introduction to libuv》

http://nikhilm.github.io/uvbook/

我遇到的问题是,打开一个子进程 ls -l /tmp,我想读取输出。这本书里面是没有提到的,我在 stackoverflow 找到了答案。

http://stackoverflow.com/questions/14751504/capture-a-child-processs-stdout-with-libuv

代码如下:

#include 
#include 
#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
", 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, requesting a %lu byte buffer
");
    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 in a %lu byte buffer
", nread, buf.len);
    if (nread + 1 > buf.len) return;
    buf.base[nread] = ""; // turn it into a cstring
    printf("read: |%s|", buf.base);
}

int main(int argc, char *argv[]) {
    printf("spawn_test
");
    loop = uv_default_loop();

    char* args[3];
    args[0] = "dummy";
    args[1] = NULL;
    args[2] = NULL;

    uv_pipe_init(loop, &apipe, 0);
    uv_pipe_open(&apipe, 0);

    options.stdio_count = 3;
    uv_stdio_container_t child_stdio[3];
    child_stdio[0].flags = UV_IGNORE;
    child_stdio[1].flags = UV_CREATE_PIPE | UV_READABLE_PIPE;
    child_stdio[1].data.stream = (uv_stream_t *) &apipe;
    child_stdio[2].flags = UV_IGNORE;
    options.stdio = child_stdio;

    options.exit_cb = on_child_exit;
    options.file = args[0];
    options.args = args;

    if (uv_spawn(loop, &child_req, options)) {
        fprintf(stderr, "%s
", uv_strerror(uv_last_error(loop)));
        return 1;
    }
    uv_read_start((uv_stream_t*)&apipe, alloc_buffer, read_apipe);

    return uv_run(loop, UV_RUN_DEFAULT);
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/7614.html

相关文章

  • 深入浅出nodeJS - 4 - (玩转进程、测试、产品化)

    摘要:进程间通信的目的是为了让不同的进程能够互相访问资源,并进程协调工作。这个过程的示意图如下端口共同监听集群稳定之路进程事件自动重启负载均衡状态共享模块工作原理事件二测试单元测试性能测试三产品化项目工程化部署流程性能日志监控报警稳定性异构共存 内容 9.玩转进程10.测试11.产品化 一、玩转进程 node的单线程只不过是js层面的单线程,是基于V8引擎的单线程,因为,V8的缘故,前后...

    henry14 评论0 收藏0
  • 系列3|走进Node.js进程模型

    摘要:例如,在方法中,如果需要主从进程之间建立管道,则通过环境变量来告知从进程应该绑定的相关的文件描述符,这个特殊的环境变量后面会被再次涉及到。 文:正龙(沪江网校Web前端工程师)本文原创,转载请注明作者及出处 之前的文章走进Node.js之HTTP实现分析中,大家已经了解 Node.js 是如何处理 HTTP 请求的,在整个处理过程,它仅仅用到单进程模型。那么如何让 Web 应用扩展到...

    snowell 评论0 收藏0
  • 进程间通信匿名管道阐述

    摘要:通信机制示例代码解释父进程调用开辟管道,得到两个文件描述符指向管道的两端。父进程关闭管道写端,子进程关闭管道读端。管道的读写端通过打开的文件描述符来传递,因此要通信的两个进程必须从它们的公共祖先那里继承管道文件描述符。 前言 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间...

    张春雷 评论0 收藏0
  • 支持多用户web终端实现及安全保障(nodejs)

    摘要:每次在命令行中输入一串命令,敲入回车,终端进程都会一个子进程,用来执行输入的命令,终端进程通过系统调用监听子进程退出,同时通过暴露的输出子进程执行信息。父进程通过创建该的实现向子进程从设备的输入输出。 背景 terminal(命令行)作为本地IDE普遍拥有的功能,对项目的git操作以及文件操作有着非常强大的支持。对于WebIDE,在没有web伪终端的情况下,仅仅提供封装的命令行接口是完...

    kaka 评论0 收藏0
  • I/O重定向和管道

    摘要:标准与重定向的若干概念个标准文件描述符所有的工具都使用文件描述符和。重定向的是而不是程序通过使用输出重定向标志,命令告诉将文件描述符定位到文件。重定向标准输入标准输出和错误输出意味着改变文件描述符和的连接。 标准I/O与重定向的若干概念 3个标准文件描述符 所有的Unix工具都使用文件描述符0、1和2。如下图所示,标准输入文件的描述符是0,标准输出的文件描述符是1,标准错误输出的文件描...

    Lemon_95 评论0 收藏0

发表评论

0条评论

layman

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<