首先推薦一本 libuv 的書《An Introduction to libuv》git
http://nikhilm.github.io/uvbook/github
我遇到的問題是,打開一個子進程 ls -l /tmp
,我想讀取輸出。這本書裏面是沒有提到的,我在 stackoverflow 找到了答案。api
http://stackoverflow.com/questions/14751504/capture-a-child-processs-stdout-with-libuvoop
代碼以下:spa
#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, requesting a %lu byte buffer\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 in a %lu byte buffer\n", nread, buf.len); if (nread + 1 > buf.len) return; buf.base[nread] = '\0'; // turn it into a cstring printf("read: |%s|", buf.base); } int main(int argc, char *argv[]) { printf("spawn_test\n"); 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\n", 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); }