2009-05-12 9 views
5

¿Y cómo puede uno saber si alguno de ellos está ocurriendo y llevar a un error devuelto por fork() o system()? En otras palabras, si fork() o system() regresa con un error, ¿cuáles son algunas cosas en Linux que puedo verificar para diagnosticar por qué ocurre ese error en particular?¿Cuáles son algunas condiciones que pueden causar fallas en fork() o system() en Linux?

Por ejemplo:

  • Sólo una simple sin memoria (resultados en ENOMEM errno) - Controlar el uso de memoria con 'libre', etc.
  • No hay memoria suficiente para el kernel para copiar las tablas de páginas y otra información contable del proceso principal (resultados en errno EAGAIN)
  • ¿Hay un límite de proceso global? (resultados en errno EAGAIN también?)
  • ¿Hay un límite de proceso por usuario? ¿Cómo puedo averiguar qué es?
  • ...?
+0

para aclarar, cuando se sabe que se ha producido un error como EAGAIN durante el tenedor() (errno == EAGAIN), ¿cómo encontrar lo que causó específicamente (se lo RLIMIT_NPROC? ¿Fue un error de copia tablas de páginas, o estructura de la tarea, y si es así ¿por qué?¿Y cómo lo evitas?) –

+0

También hice una pregunta diferente, pero relacionada con las tablas de páginas en Linux: http://stackoverflow.com/questions/853736/how-to-find-or-calculate-a-linux- processs-page-table-size-and-other-kernel-accou –

Respuesta

6

Y ¿cómo se puede averiguar si alguno de ellos se están produciendo?

Comprobar el valorerrno si el resultado (valor de retorno) es -1

Desde la página del manual en Linux:

VALOR DEVUELTO
En caso de éxito, el PID del el proceso hijo se devuelve en el padre y 0 se devuelve en el hijo. En caso de error, -1 se devuelve en el elemento primario, no se crea ningún proceso hijo y errno se establece de forma adecuada.

ERRORES
EAGAIN
tenedor() no puede asignar memoria suficiente para copiar tablas de páginas del padre y alojar una estructura de tarea para el niño.
EAGAIN
No fue posible crear un nuevo proceso porque se encontró el límite de recursos RLIMIT_NPROC de la persona que llama. Para superar este límite, el proceso debe tener la capacidad CAP_SYS_ADMIN o CAP_SYS_RESOURCE.
ENOMEM
fork() no pudo asignar las estructuras necesarias del kernel porque la memoria está apretada.

CONFORME A SVr4, 4.3BSD, POSIX.1-2001.

+1

El valor de retorno es -1, la variable errno se establece en EAGAIN, ENOMEM, etc. –

+0

@Chas. Owens Eso es lo que dije. "Verifique el valor errno SI el resultado es -1". – lothar

+0

Ah, lo analicé como comprobar el errno para -1, lo siento. –

1

nproc en /etc/security/limits.conf puede limitar el número de procesos por usuario.

Puede comprobar la falla examinando el retorno de la horquilla. Un 0 significa que usted está en el niño, un número positivo es el pid del niño y significa que usted está en el padre, y un número negativo significa que el tenedor falló. Cuando la horquilla falla, establece la variable externa errno. Puede usar las funciones en errno.h para examinarlo. Normalmente solo uso perror para imprimir el error (con algo de texto adjunto) en stderr.

#include <stdio.h> 
#include <errno.h> 
#include <unistd.h> 

int main(int argc, char** argv) { 
    pid_t pid; 

    pid = fork(); 
    if (pid == -1) { 
     perror("Could not fork: "); 
     return 1; 
    } else if (pid == 0) { 
     printf("in child\n"); 
     return 0; 
    }; 

    printf("in parent, child is %d\n", pid); 

    return 0; 
} 
Cuestiones relacionadas