Android,ADB,将STDOUT重定向到套接字
Android, ADB, redirecting STDOUT to a socket
环境
- Android
- C++
- ADB
- GDB
用例
- 捕获屏幕截图
- 做一些处理
- 从设备发出
实施(根据此链接)
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实现了
相关文章:
- 当套接字连接断开时检测C/C++Unix
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 套接字读取后,我在缓冲区中看到意外输入
- 如何在CPP中创建应该在Windows和Linux上运行的套接字?
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- (Winsock) UDP 接收工作正常,但同一套接字的发送失败
- MSG_WAITALL的套接字发送得到了 22 EINVAL
- C++套接字客户端到 Python 服务器未创建连接
- 在不知道套接字的情况下关闭网络连接
- C++套接字对不读/写父/子
- 当客户端在 write() 期间终止连接时,由对等套接字错误重置连接
- 网络tcp套接字应用程序重试方法
- 将 printf 和 cout 重定向到套接字
- zeromq:重置REQ/REP套接字状态
- Android,ADB,将STDOUT重定向到套接字
- 使用套接字重定向