2009-05-12 9 views
5

Jak można sprawdzić, czy którykolwiek z nich występuje, i co prowadzi do błędu zwracanego przez fork() lub system()? Innymi słowy, jeśli fork() lub system() zwróci błąd, jakie rzeczy w Linuksie mogę sprawdzić, aby zdiagnozować przyczynę tego błędu?Jakie są niektóre warunki, które mogą spowodować, że wywołania fork() lub system() przestaną działać w systemie Linux?

Na przykład:

  • Po prostu z pamięci (wyniki w errno ENOMEM) - sprawdzić wykorzystanie pamięci z „wolny” itd
  • Za mało pamięci do jądra do skopiowania tablic stron i innych informacji stanowiących procesu macierzystego (wyniki errno EAGAIN)
  • Czy istnieje globalny limit procesów? (wyniki w errno EAGAIN również?)
  • Czy istnieje limit dla użytkownika? Jak mogę się dowiedzieć, co to jest?
  • ...?
+0

celu wyjaśnienia, kiedy się wie, że błąd taki jak EAGAIN wystąpił podczas fork() (errno == EAGAIN), jak można dowiedzieć się, co konkretnie spowodowało to (było to RLIMIT_NPROC? Czy to był błąd kopiowania tabele stron lub skrypty zadań, a jeśli tak, dlaczego?I jak tego uniknąć?) –

+0

Zapytałem również inne, ale powiązane pytanie dotyczące tabel stron w systemie Linux: http://stackoverflow.com/questions/853736/how-to-find-or-calculate-a-linux- processs-page-table-size-and-other-kernel-accou –

Odpowiedz

6

Jak można sprawdzić, czy którekolwiek z nich występują?

Sprawdź errno wartość, jeżeli wynik (wartość zwracana) -1

Od strony człowieka w systemie Linux:

Zwracana wartość
Po pomyślnym PID proces potomny jest zwracany w obiekcie nadrzędnym, a wartość 0 jest zwracana w elemencie potomnym. W przypadku niepowodzenia zwracane jest -1 w obiekcie nadrzędnym, proces potomny nie jest tworzony, a zmienna errno jest odpowiednio ustawiana.

BŁĘDY
EAGAIN
fork() nie może przydzielić wystarczającej ilości pamięci do skopiowania tablic stron rodzica i przydzielić struktury zadania dla dziecka.
EAGAIN
Utworzenie nowego procesu nie było możliwe, ponieważ napotkano limit zasobów wywołującego RLIMIT_NPROC. Aby przekroczyć ten limit, proces musi mieć możliwość CAP_SYS_ADMIN lub CAP_SYS_RESOURCE.
ENOMEM
fork() nie przydzieliło niezbędnych struktur jądra, ponieważ pamięć jest napięta.

ZGODNE Z SVr4, 4.3BSD, POSIX.1-2001.

+1

Wartość zwracana wynosi -1, zmienna errno jest ustawiona na EAGAIN, ENOMEM itd. –

+0

@Chas. Owens Tak powiedziałem. "Sprawdź wartość errno, jeśli wynik wynosi -1". – lothar

+0

Ah, przeanalizowałem to jako sprawdzenie errno dla -1, przepraszam. –

1

nproc w /etc/security/limits.conf może ograniczyć liczbę procesów na użytkownika.

Możesz sprawdzić awarię, sprawdzając zwrot z widelca. 0 oznacza, że ​​jesteś dzieckiem, dodatnią liczbą jest pid dziecka i oznacza, że ​​jesteś w rodzicu, a liczba ujemna oznacza, że ​​widelec się nie powiódł. Gdy fork się nie powiedzie, ustawia zewnętrzną zmienną errno. Możesz użyć funkcji z errno.h, aby go przejrzeć. Zwykle używam perror, aby wydrukować błąd (z pewnym tekstem dołączonym do niego) na 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; 
} 
Powiązane problemy