Android,ADB,将STDOUT重定向到套接字

时间:2014-11-09 07:38:21

标签: android c++ linux android-ndk

环境

  • 的Android
  • C ++
  • ADB
  • GDB

用例

  1. 捕获屏幕截图
  2. 做一些处理
  3. 发送出设备。
  4. 实施(根据this link

    1.实施ADB命令行工具
    2.该工具实现TCP服务器
    3.1。新的连接,
    3.1.1。创建套接字对
    3.1.2。 fork,执行" screencap"同时使用dup2将STDOUT重定向到socketpair 3.1.3。处理传入的数据并发送回连接的对等体

    问题描述

    虽然forked进程已正确实例化并且成功创建了screencap(以root身份),但父进程(作为shell运行)并未在套接字对上接收任何内容并无限地阻塞。

    • 当我使用管道(使用pipe2)
    • 时也会发生同样的情况
    • "撷取画面"验证输出stdout所需的内容。
    • 我做错了什么?
      如何将一个进程的STDOUT重定向到连接到父进程的套接字?

    代码捕捉

    int fd_screencap;
    int w, h, f;
    int fds[2];
    pid_t pid;
    
    if(SOCKET_ERROR == socketpair(PF_LOCAL, SOCK_STREAM, 0, fds))
        goto pipefail;
    if ((pid = fork()) < 0)
        goto done;
    if (pid == 0) {
        int newfd = dup2(fds[0], STDOUT_FILENO);
        assert(newfd == STDOUT_FILENO);
        close(fds[0]);
        close(fds[1]);
        const char* command = "screencap";
        const char *args[2] = { command, NULL };
        execvp(command, (char**)args);
        exit(1);
    }
    
    fd_screencap = fds[1];
    if (recv(fd_screencap, &w, 4, MSG_WAITALL) <= 0) // <<== BLOCKS INFINITLY
        goto done;
    if (recv(fd_screencap, &h, 4, MSG_WAITALL) <= 0)
        goto done;
    if (recv(fd_screencap, &f, 4, MSG_WAITALL) <= 0)
        goto done;
    

1 个答案:

答案 0 :(得分:0)

用PF_UNIX替换PF_LOCAL就可以了解