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

Android, ADB, redirecting STDOUT to a socket

本文关键字:套接字 重定向 ADB Android STDOUT      更新时间:2023-10-16

环境

  • Android
  • C++
  • ADB
  • GDB

用例

  1. 捕获屏幕截图
  2. 做一些处理
  3. 从设备发出

实施(根据此链接)

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

问题描述

当分叉进程被正确地实例化并且screencap被成功地创建(作为root)时,父进程(作为shell运行)不会在套接字对上接收任何东西,而是无限地阻塞。

  • 当我使用管道(带有管道2)时也会发生同样的情况
  • 验证"screencap"以输出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;

用PF_UNIX替换PF_LOCAL实现了