2009-05-12 5 views
5

И как можно узнать, происходит ли какое-либо из них, и приводит к ошибке, возвращаемой fork() или system()? Другими словами, если fork() или system() возвращаются с ошибкой, что в Linux есть некоторые вещи, которые я могу проверить, чтобы диагностировать причину этой конкретной ошибки?Какие условия могут вызвать вызовы fork() или system() для отказа в Linux?

Например:

  • Попросту из памяти (результаты в Errno ENOMEM) - проверить использование памяти с «свободной» и т.д.
  • не достаточно памяти для ядра для копирования таблиц страниц и другой бухгалтерской информации родительского процесса (результаты в errno EAGAIN)
  • Существует ли глобальный предел процесса? (результаты в errno EAGAIN тоже?)
  • Есть ли лимит процесса для каждого пользователя? Как я могу узнать, что это такое?
  • ...?
+0

Чтобы уточнить, когда один знает, что ошибка, такие как EAGAIN произошло во время вилке() (ERRNO == EAGAIN), как вы узнали, что именно вызвало это (было это RLIMIT_NPROC? Была ли это ошибка копирования таблиц страниц или структуры задач, и если да, то почему?И как вы его избегаете?) –

+0

Я также задал другой, но связанный с этим вопрос о таблицах страниц в Linux: http://stackoverflow.com/questions/853736/how-to-find-or-calculate-a-linux- processs-page-table-size-and-other-kernel-accou –

ответ

6

И как можно узнать, происходит ли какое-либо из них?

Проверить значения ERRNO, если результат (возвращаемое значение) составляет -1

На странице людей на Linux:

ВОЗВРАТ СТОИМОСТИ
В случае успеха, PID из дочерний процесс возвращается родительскому элементу, а 0 возвращается в дочерний элемент. При ошибке -1 возвращается родительскому, дочерний процесс не создается, а errno устанавливается соответствующим образом.

ОШИБКИ
EAGAIN
вилка() не может выделить достаточно памяти для копирования таблиц страниц родителя и выделить структуру задачи для ребенка.
EAGAIN
Не удалось создать новый процесс, потому что был достигнут предел ресурса RLIMIT_NPROC вызывающего абонента. Чтобы превысить этот предел, процесс должен иметь возможность CAP_SYS_ADMIN или CAP_SYS_RESOURCE.
ENOMEM
fork() не удалось выделить необходимые структуры ядра, потому что память плотная.

СООТВЕТСТВИЕ ДО SVr4, 4.3BSD, POSIX.1-2001.

+1

Возвращаемое значение равно -1, переменной errno присваивается значение EAGAIN, ENOMEM и т. д. –

+0

@Chas. Оуэнс Вот что я сказал. «Проверьте значение errno, если результат равен -1». – lothar

+0

Ах, я разобрал его, как проверить errno на -1, извините. –

1

nproc в /etc/security/limits.conf может ограничить количество процессов на пользователя.

Вы можете проверить на предмет отказа, изучив возврат из вилки. A 0 означает, что вы находитесь у ребенка, положительное число - это pid дочернего элемента и означает, что вы находитесь в родительском, а отрицательное число означает, что fork не удалось. Когда fork выходит из строя, он устанавливает внешнюю переменную errno. Вы можете использовать функции в errno.h, чтобы изучить его. Обычно я использую perror для печати ошибки (с некоторым добавленным текстом к ней) в 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; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^