Si yo uso esto:Runtime.exec() ERROR: cuelga sin proporcionar un objeto de proceso
process = Runtime.getRuntime().exec("logcat -d time");
o que:
process = new ProcessBuilder()
.command("logcat", "-d", "time")
.redirectErrorStream(true)
.start();
consigo los mismos resultados: a menudo se cuelga en el ejecutivo() o start() llamada, sin importar lo que intenté hacer! ¡El hilo que se ejecuta no se puede interrumpir con Thread.interrupt()! El proceso hijo definitivamente se inicia y si se cancela los comandos anteriores regresan.
Estas llamadas pueden fallar en el primer intento, por lo que NO HAY MANERA DE LEER SU SALIDA! También puedo usar una simple línea de comando "su -c kill xxx", ¡el mismo resultado!
EDIT: ¡Comenzó a depurar el archivo java_lang_ProcessManager.cpp en un proyecto NDK con algunos registros de depuración! Así que aquí es lo que he encontrado hasta el momento, después de que el tenedor() el padre hace esto:
int result;
int count = read(statusIn, &result, sizeof(int)); <- hangs there
close(statusIn);
Aunque el proceso hijo no se supone que bloquear en él: Eso es lo que el niño (si se inicia en absoluto !):
// 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);
el niño puede fallar por 2 razones reproducibles: 1- código niño no se está ejecutando, pero el padre cree que es! 2- bloques secundarios en closeNonStandardFds (statusOut, androidSystemPropertiesFd);
En cualquier caso, la lectura (estadoEn ...) en el elemento primario termina en interbloqueo. y un proceso secundario se deja muerto (y no se puede acceder, pid desconocido, ¡no hay objeto de proceso)!
http://developer.android.com/reference/java/lang/Process.html – Selvin
¿Estás seguro de que leíste * todo * el resultado de tu proceso? Lo lees en un bucle, ¿verdad? – JimmyB
Sí, iniciando inmediatamente un hilo para leer la salida de forma continua. A veces, la primera llamada a exec() solo se cuelga, por lo que no hay nada que leer, ya que el objeto de proceso no se ha devuelto todavía, por lo tanto, no se puede retener en las transmisiones. ¡Entonces nada que ver con leer la salida! Actualmente estoy reproduciendo el problema con el código fuente NDK y agregando información de depuración para rastrear esto. Curiosamente, descubrió que agregar algunos registros hace que el problema sea más difícil de reproducir. Es el exec() seguro para subprocesos? – 3c71