1. ADB 명령 줄 도구
구현 2.이 도구는 TCP 서버 구현 3.1.
새 연결시
3.1.1. 소켓 쌍 생성
3.1.2. fork, dup2를 사용하여 STDOUT을 socketpair로 리디렉션하는 동안 "screencap"을 실행
합니다. 3.1.3. 들어오는 데이터를 처리하고 연결된 피어로 다시 보냅니다.
분기 된 프로세스가 적절하게 인스턴스화되고 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;
PF_LOCAL을 PF_UNIX로 바꾸는 것이 트릭이었습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다