Linux программирование в примерах
Linux программирование в примерах читать книгу онлайн
В книге рассмотрены вопросы, связанные с программированием под Linux: файловый ввод/вывод, метаданные файлов, основы управления памятью, процессы и сигналы, пользователи и группы, вопросы интернационализации и локализации, сортировка, поиск и многие другие. Много внимания уделено средствам отладки, доступным под GNU Linux. Все темы иллюстрируются примерами кода, взятого из V7 UNIX и GNU. Эта книга может быть полезна любому, кто интересуется программированием под Linux.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
if ((niceval = nice(inc)) < 0 && errno != 0) { fprintf(stderr, "nice(%d) failed: %sn", inc, strerror(errno)); /* другое восстановление */}Этот пример может завершиться неудачей, если в
incroot9.1.3.1. POSIX против действительности
Диапазон значений относительного приоритета от -20 до 19, которые использует Linux, имеет исторические корни; он ведет начало по крайней мерее V7. POSIX выражает состояние менее прямым языком, что дает возможность большей гибкости, сохраняя в то же время историческую совместимость. Это также затрудняет чтение и понимание стандарта, вот почему вы и читаете эту книгу. Итак, вот как описывает это POSIX
Во-первых, значение относительного приоритета процесса, поддерживаемое системой, колеблется от 0 до '
(2 * NZERO) - 1NZERO<limits.h>Во-вторых, как мы описывали, сумма текущего значения относительного приоритета и приращение
incrВ заключение, возвращаемое
nice()NZERONZEROРезультатом является то, что возвращаемое nice() значение в действительности изменяется от '
-NZERONZERO-1NZERO9.1.4. Запуск новой программы: семейство
exec()После запуска нового процесса (посредством
fork()#include <unistd.h> /* POSIX */int execve(const char *filename, /* Системный вызов */char *const argv[], char *const envp[]);int execl(const char *path, const char *arg, ...); /* Оболочки */int execlp(const char *file, const char *arg, ...);int execle(const char *path, const char *arg, ..., char *const envp[]);int execv(const char *path, char *const argv[]);int execvp(const char *file, char *const argv[]);Мы ссылаемся на эти функции как на «семейство
exec()exec()fork()exec9.1.4.1. Системный вызов
execve()Простейшей для объяснения функцией является
execve()int execve(const char *filename, char *const argv[], char* const envp[]);filenameexecve()#!#!argv[0]NULLenvpenvironenvironПрограмма не должна возвращаться из вызова
exec()errno ENOENTEACCESSВ предположении, что вызов был успешным, текущее содержимое адресного пространства процесса сбрасывается. (Ядро сначала сохраняет в безопасном месте данные
argvenvpexecve()main()execve()argvmain()argcК этому моменту новая программа запущена. Она не знает (и не может определить), какая программа была в процессе до нее. Обратите внимание, что ID процесса не меняется. Многие другие атрибуты при вызове
execexec()exec()
