1.实施ADB命令行工具
2.该工具实现TCP服务器
3.1。新的连接,
3.1.1。创建套接字对
3.1.2。 fork,执行" screencap"同时使用dup2将STDOUT重定向到socketpair
3.1.3。处理传入的数据并发送回连接的对等体
虽然forked进程已正确实例化并且成功创建了screencap(以root身份),但父进程(作为shell运行)并未在套接字对上接收任何内容并无限地阻塞。
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;
答案 0 :(得分:0)
用PF_UNIX替换PF_LOCAL就可以了解