2009-05-12 12 views
5

E come si può scoprire se qualcuno di questi si sta verificando e che porta a un errore restituito da fork() o system()? In altre parole, se fork() o system() restituisce un errore, quali sono alcune cose in Linux che posso verificare per diagnosticare perché sta accadendo quel particolare errore?Quali sono alcune condizioni che possono causare il fallimento di chiamate fork() o system() su Linux?

Ad esempio:

  • semplicemente fuori di memoria (risultati in errno ENOMEM) - Controllare l'utilizzo della memoria con 'libero', ecc
  • Memoria insufficiente per il kernel per copiare tabelle delle pagine e altre informazioni contabili del processo genitore (risultati in errno EAGAIN)
  • Esiste un limite di processo globale? (risultati anche in errno EAGAIN?)
  • Esiste un limite di processo per utente? Come posso sapere di cosa si tratta?
  • ...?
+0

per chiarire, quando si sa che si è verificato un errore come EAGAIN durante fork() (errno == EAGAIN), come si fa a scoprire che cosa specificamente causato (era RLIMIT_NPROC? È stato un errore di copiatura tabelle delle pagine o struttura delle attività e, in caso affermativo, perché?E come lo evitate?) –

+0

Ho anche chiesto una diversa, ma correlata domanda sulle tabelle delle pagine in Linux: http://stackoverflow.com/questions/853736/how-to-find-or-calculate-a-linux- processs-page-table-size-and-other-kernel-accou –

risposta

6

E come si può scoprire se qualcuno di essi si verifica?

Controllare il valore dierrno se il risultato (valore di ritorno) è -1

Dalla pagina man su Linux:

VALORE DI RITORNO
In caso di successo, il PID del il processo figlio viene restituito nel genitore e 0 viene restituito nel figlio. In caso di fallimento, -1 viene restituito nel genitore, non viene creato alcun processo figlio e errno viene impostato in modo appropriato.

ERRORI
EAGAIN
fork() non può allocare memoria sufficiente per copiare le tabelle delle pagine del padre e allocare una struttura di task per il figlio.
EAGAIN
Non è stato possibile creare un nuovo processo perché è stato rilevato il limite di risorse RLIMIT_NPROC del chiamante. Per superare questo limite, il processo deve avere CAP_SYS_ADMIN o CAP_SYS_RESOURCE.
ENOMEM
fork() non è riuscito ad allocare le strutture del kernel necessarie perché la memoria è stretta.

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

+1

Il valore restituito è -1, la variabile errno è impostata su EAGAIN, ENOMEM, ecc. –

+0

@Chas. Owens Questo è quello che ho detto. Msgstr "Controlla il valore errno SE il risultato è -1". – lothar

+0

Ah, l'ho analizzato come controllare l'errno per -1, mi dispiace. –

1

nproc in /etc/security/limits.conf può limitare il numero di processi per utente.

È possibile verificare l'esito negativo esaminando il ritorno dalla forcella. A 0 significa che sei nel bambino, un numero positivo è il pid del bambino e significa che sei nel genitore, e un numero negativo significa che la forcella ha fallito. Quando la forchetta non funziona, imposta la variabile esterna errno. È possibile utilizzare le funzioni in errno.h per esaminarlo. Normalmente uso solo perror per stampare l'errore (con del testo aggiunto ad esso) su 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; 
} 
Problemi correlati