Runtime.exec()bug:挂起不提供流程对象?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (41)

用这个:

process = Runtime.getRuntime().exec("logcat -d time");

或者说:

process = new ProcessBuilder()
              .command("logcat", "-d", "time")
              .redirectErrorStream(true)
              .start();

在fork()之后,父程序执行以下操作:

int result;
int count = read(statusIn, &result, sizeof(int));            <- hangs there
close(statusIn);

尽管子进程不应该阻塞它:

    // Make statusOut automatically close if execvp() succeeds.
    fcntl(statusOut, F_SETFD, FD_CLOEXEC);                      <- make the parent will not block

    // Close remaining unwanted open fds.
    closeNonStandardFds(statusOut, androidSystemPropertiesFd);  <- hangs here sometimes

    ...

    execvp(commands[0], commands);

    // If we got here, execvp() failed or the working dir was invalid.
    execFailed:
        int error = errno;
        write(statusOut, &error, sizeof(int));
        close(statusOut);
        exit(error);

提问于
用户回答回答于

以上解决方案在任何方面都不可靠,会在某些设备上造成更多问题!

所以我回到了标准.exec()

注意到子进程将挂起,同时试图关闭从父进程继承的所有文件描述符

用户回答回答于

扫码关注云+社区