C в *nix – залог здоровья Косякин Антон Спецвыпуск: Хакер, номер #051, стр. 051-078-5 Для изменения маски создания файла существует системный вызов Umask, принимающий единственный параметр типа mode_t (который в очередной раз оказывается обычным целыми числом). Например, вызов umask(022) запрещает вновь созданным файлам текущего процесса присвоение файлу прав доступа на запись. Всем, кроме владельца. Раз речь зашла о правах доступа, и теперь стоит упомянуть такой системный вызов, как Access, который определяет, может ли процесс получить доступ к файлу в соответствии с истинным (а не с действующим) идентификатором пользователя и группы. И еще один системный вызов - Chmod. Здесь комментарии излишни. В *nix один файл может иметь несколько имен. То есть существует возможность связать одну и ту же последовательность данных с несколькими именами, а создавать копии файла не нужно. Такое имя называется жесткой ссылкой, а количество таких ссылок, связанных с файлом, - счетчик ссылок. Для добавления нового имени используется системный вызов Link (const char *original, const char *link), а для удаления – Unlink (char *name), который просто удаляет указанное имя и уменьшает счетчик ссылок на единицу. Сами же данные будут безвозвратно потеряны только в том случае, если этот счетчик равен нулю и если указанный файл не открыт для чтения ни в одной программе. Замечу, что для создания символьных ссылок используется системный вызов Symlink, описанный в unistd.h. Многозадачность Время однозадачных ОС уже прошло, и большинство современных операционных систем - многозадачные. К ним можно применять понятие процесса, некоторое количество которых может одновременно выполняться в текущий момент времени. Основным примитивом, создающим процесс в *nix-системах, является системный вызов Fork() – фактически в нем и заключается вся многозадачность ОС. После успешного вызова этой функции ядро создаст новый, почти идентичный текущему процесс - дочерний. Оба процесса будут выполняться одновременно, продолжая свое выполнение с оператора, следующего за Fork(). Как различить эти два процесса? Если функция возвращает 0, значит, ты добрался до процесса-потомка. Если возвращаемое число > 0, то ты застрял на родительском. Иначе - системный вызов завершился с ошибкой, которую нужно анализировать. Следующим системным вызовом, который необходимо упомянуть - Execve, а точнее целое семейство вызовов, которые в итоге сводятся к одному, упомянутому мной. Выполняемая функция данного множества системных вызовов одна - загрузка новой программы в пространство памяти процесса. После одного из таких вызовов ни одного оператора, следующего за ним, выполнено не будет. Конечно, если и сюда ошибка не добралась своими грязными руками. Кроме процессов существует еще один вид программной сущности - потоки. Что-то вроде облегченных процессов, выполняющихся в одном адресном пространстве. Примитивов работы с ними немало, и для каждой системы они свои. Однако любая POSIX-система включает в себя реализацию Posix-threads. Пару слов о ней: в ОС есть набор функций, описанных в pthread.h и называющихся pthread_*. Например, pthread_create() создает новый поток, возвращая его идентификатор. Конечно, одним из параметров этой функции будет указатель на функцию, которая станет новым потоком и начнет свое выполнение. Функция Pthread_cancel может попытаться завершить поток, а Pthread_exit будет являться аналогом обычного Exit для процесса. |