воскресенье, 20 апреля 2014 г.

Системные вызовы linux

  1. getpid() - значение идентификатора текущего процесса Библиотеки:
    #include <sys/types.h>
    #include <unistd.h>

    pid_t getpid(void); 
  2. getppid() - значение идентификатора родительского процесса для текущего процесса ()Библиотеки:
    #include <sys/types.h>
    #include <unistd.h>

    pid_t getppid(void); 
  3. fork() - порождает новый процесс. При этом вновь созданный процесс будет являться практически полной копией родительского процесса. У порожденного процесса по сравнению с родительским процессом (на уровне уже полученных знаний) изменяются значения следующих параметров: идентификатор процесса – PID; идентификатор родительского процесса – PPID.
    #include <sys/types.h>
    #include <unistd.h>
    pid_t fork(void);

    У порожденного процесса по сравнению с родительским
    изменяются значения следующих параметров:
    • идентификатор процесса;
    • идентификатор родительского процесса;
    • время, оставшееся до получения сигнала SIGALRM;
    • сигналы, ожидавшие доставки родительскому процессу, не будут доставляться порожденному процессу. При однократном системном вызове возврат из него может произойти дважды: один раз в родительском процессе, а второй раз в порожденном процессе. Если создание нового процесса произошло успешно, то в порожденном процессе системный вызов вернет значение 0, а в родительском  процессе – положительное значение, равное идентификатору процесса-ребенка. Если создать новый процесс не удалось, то  системный вызов вернет в инициировавший его процесс отрицательное значение.
     
  4. #include <stdlib.h>
    void exit(int status);

    Функция exit служит для нормального завершения процесса. При выполнении этой функции происходит сброс всех частично  заполненных буферов ввода-вывода с закрытием соответствующих потоков (файлов, pipe, FIFO, сокетов), после чего инициируется системный вызов прекращения работы процесса и перевода его в  состояние закончил исполнение Возврата из функции в текущий процесс не происходит, и функция ничего не возвращает. Значение параметра status – кода завершения процесса – передается ядру.
     
  5. exec()
    Функции изменения пользовательского контекста процесса
    Прототипы функций
    #include <unistd.h>
    int execlp(const char *file,
    const char *arg0,
    ... const char *argN,(char *)NULL)
    int execvp(const char *file, char *argv[])
    int execl(const char *path,
    const char *arg0,
    ... const char *argN,(char *)NULL)
    int execv(const char *path, char *argv[])
    int execle(const char *path,
    const char *arg0,
    ... const char *argN,(char *)NULL,
    char * envp[])
    int execve(const char *path, char *argv[],
    char *envp[])
    Описание функций
    Для загрузки новой программы в системный контекст текущего  процесса используется семейство взаимосвязанных функций,  отличающихся друг от друга формой представления параметров.
    Аргумент file является указателем на имя файла, который должен  быть загружен.
    Аргумент path – это указатель на полный путь к файлу, который должен быть загружен.
    Аргументы arg0, ..., argN  представляют собой указатели на аргументы командной строки. Заметим, что аргумент arg0 должен указывать на имя загружаемого файла.
    Аргумент argv представляет собой массив из указателей на аргументы командной строки. Начальный элемент массива должен указывать на имя загружаемой программы, а заканчиваться массив должен элементом, содержащим указатель NULL.
    Аргумент envp является массивом указателей на параметры  окружающей среды, заданные в виде строк "переменная=строка". Последний элемент этого массива должен содержать указатель NULL.
    Поскольку вызов функции не изменяет системный контекст текущего процесса, загруженная программа унаследует от загрузившего ее процесса следующие атрибуты:
    • идентификатор процесса;
    • идентификатор родительского процесса;
    • групповой идентификатор процесса;
    • идентификатор сеанса;
    • время, оставшееся до возникновения сигнала SIGALRM;
    • текущую рабочую директорию;
    • маску создания файлов;
    • идентификатор пользователя;
    • групповой идентификатор пользователя;
    • явное игнорирование сигналов;
    • таблицу открытых файлов (если для файлового дескриптора не устанавливался признак "закрыть файл при выполнении exec()").
    В случае успешного выполнения возврата из функций в программу, осуществившую вызов, не происходит, а управление передается  загруженной программе. В случае неудачного выполнения в  программу, инициировавшую вызов, возвращается отрицательное значение.

    Прототипы функций
    #include <unistd.h>
    int execlp(const char *file, const char *arg0,… const char *argN, (char *)NULL );
    int execvp(const char *file, char *argv[]);
    int execl(const char *path, const char *arg0,… const char *argN, (char *)NULL );
    int execv(const char *path, char *argv[]);
    int execle(const char *path, const char *arg0,… const char *argN, (char *)NULL, char *envp[]);
    int execve(const char *path, char *argv[], char *envp[]);

    file — указатель на имя файла, который должен быть загружен.
    path — указатель на полный путь к файлу, который должен быть загружен.
    arg0,… ,argN — указатели на аргументы командной строки.
    argv — массив из указателей на аргументы командной строки.
    envp — массив указателей на параметры окружающей среды.

    Суффиксы l, v, p и e, добавляемые к имени семейства exec  обозначают, что данная функция будет работать с некоторыми особенностями:

    p — определяет, что функция будет искать «дочернюю»
    программу в директориях, определяемых  переменной среды DOS PATH. Без суффикса p поиск будет производиться только в рабочем каталоге. Если параметр path не содержит маршрута, то поиск производится в текущей директории, а затем по маршрутaм,  определяемым переменной окружения PATH.

    l — показывает, что адресные указатели (arg0, arg1, ..., argn) передаются, как отдельные аргументы. Обычно суффикс l  употребляется, когда число передаваемых аргументов заранее вам известно.

    v — показывает, что адресные указатели (arg[0], arg[1],...arg[n]) передаются, как массив указателей. Обычно, суффикс v используется,  когда передаeтся переменное число аргументов.

    e — показывает, что «дочернему» процессу может быть  передан аргумент envp, который позволяет выбирать среду «дочернего» процесса. Без суффикса e «дочерний» процесс унаследует среду
    «родительского» процесса. 
  6.  Системный вызов open
    Прототип системного вызова
    #include <fcntl.h>
    int open(char *path, int flags);
    int open(char *path, int flags, int mode);

    Описание системного вызова
    Системный вызов open предназначен для выполнения операции открытия файла и, в случае ее удачного осуществления, возвращает файловый дескриптор открытого файла (небольшое неотрицательное целое число, которое используется в дальнейшем для других операций с этим файлом).
    Параметр path является указателем на строку, содержащую полное или относительное имя файла.
    Параметр flags может принимать одно из следующих трех значений:
      - O_RDONLY – если над файлом в дальнейшем будут совершаться только операции чтения;
      - O_WRONLY –
    если над файлом в дальнейшем будут осуществляться только
    операции записи;
      - O_RDWR – если над файлом будут осуществляться и операции чтения, и операции записи.
    Каждое из этих значений может быть скомбинировано посредством операции "побитовое или ( | )" с одним или несколькими флагами:
    - O_CREAT – если файла с указанным именем не существует, он должен быть создан;
    - O_EXCL – применяется совместно с флагом O_CREAT. При совместном их
    использовании и существовании файла с указанным именем, открытие файла не производится и констатируется ошибочная ситуация;
    - O_NDELAY – запрещает перевод процесса в состояние ожидание при выполнении операции открытия и любых последующих операциях над этим файлом;
    - O_APPEND – при открытии файла и перед выполнением каждой операции записи (если она, конечно, разрешена) указатель текущей позиции в файле устанавливается на конец файла;
    - O_TRUNC –если файл существует, уменьшить его размер до 0, с  сохранением существующих атрибутов файла, кроме, быть может, времен последнего доступа к файлу и его последней модификации.
    Кроме того, в некоторых версиях операционной системы UNIX могут  применяться
    дополнительные значения флагов:
    - O_SYNC – любая операция записи в файл будет блокироваться (т. е. процесс будет переведен в состояние ожидание) до тех пор, пока записанная информация не будет физически помещена на соответсвующий нижележащий уровень hardware;
    - O_NOCTTY – если имя файла относится к терминальному устройству, оно не становится управляющим терминалом процесса, даже если до этого процесс не имел управляющего терминала.
    Параметр mode устанавливает атрибуты прав доступа различных  категорий пользователей к новому файлу при его создании. Он обязателен, если среди заданных флагов присутствует флаг O_CREAT, и может быть опущен в противном случае. Этот параметр задается как
    сумма следующих восьмеричных значений:
    - 0400 – разрешено чтение для пользователя, создавшего файл;
    - 0200 – разрешена запись для пользователя, создавшего файл;
    - 0100 – разрешено исполнение для пользователя, создавшего файл;
    - 0040 – разрешено чтение для группы пользователя, создавшего файл;
    - 0020 – разрешена запись для группы пользователя, создавшего файл;
    - 0010 – разрешено исполнение для группы пользователя, создавшего файл;
    - 0004 – разрешено чтение для всех остальных пользователей;
    - 0002 – разрешена запись для всех остальных пользователей;
    - 0001 – разрешено исполнение для всех остальных пользователей.
    При создании файла реально устанавливаемые права доступа получаются из стандартной комбинации параметра mode и маски создания файлов текущего процесса umask, а именно 0 они равны mode & ~umask.
    При открытии файлов типа FIFO системный вызов имеет некоторые особенности поведения по сравнению с открытием файлов других типов. Если FIFO открывается только для чтения, и не задан флаг O_NDELAY, то процесс, осуществивший системный вызов, блокируется до тех пор, пока какой-либо другой процесс не откроет FIFO на запись. Если флаг  O_NDELAY задан, то возвращается значение файлового дескриптора, ассоциированного с FIFO. Если FIFO открывается только для записи, и не задан флаг O_NDELAY, то процесс, осуществивший системный вызов, блокируется до тех пор, пока какой-либо другой процесс не откроет FIFO на чтение. Если флаг O_NDELAY задан, то констатируется возникновение
    ошибки и возвращается значение -1. Возвращаемое значение
    Системный вызов возвращает значение файлового дескриптора для открытого файла при
    нормальном завершении и значение -1 при возникновении ошибки.
    Системный вызов open() использует набор флагов для того, чтобы специфицировать операции, которые предполагается применять к файлу в дальнейшем или которые должны быть выполнены непосредственно в момент открытия файла. Из всего возможного набора флагов на текущем уровне знаний нас будут интересовать только флаги O_RDONLY,
    O_WRONLY, O_RDWR, O_CREAT и O_EXCL. Первые три флага являются
    взаимоисключающими: хотя бы один из них должен быть применен и наличие одного из них не допускает наличия двух других. Эти флаги описывают набор операций, которые, при успешном открытии файла, будут разрешены над файлом в дальнейшем: только чтение, только запись, чтение и запись. Как вам известно, у каждого файла существуют атрибуты
    прав доступа для различных категорий пользователей. Если файл с за данным именем существует на диске, и права доступа к нему для пользователя, от имени которого работает текущий процесс, не противоречат запрошенному набору операций, то операционная
    система сканирует таблицу открытых файлов от ее начала к концу в поисках первого свободного элемента, заполняет его и возвращает индекс этого элемента в качестве файлового дескриптора открытого файла. Если файла на диске нет, не хватает прав или отсутствует свободное место в таблице открытых файлов, то констатируется возникновение ошибки.
    В случае, когда мы допускаем, что файл на диске может отсутствовать, и хотим, чтобы он был создан, флаг для набора операций должен использоваться в комбинации с флагом O_CREAT. Если файл существует, то все происходит по рассмотренному выше сценарию. Если файла нет, сначала выполняется создание файла с набором прав, указанным в параметрах системного вызова. Проверка соответствия набора операций объявленным правам доступа может и не производиться (как, например, в Linux). В случае, когда мы требуем, чтобы файл на диске отсутствовал и был создан в момент открытия, флаг для набора операций должен использоваться в комбинации с флагами O_CREAT и O_EXCL.
  7. Системные вызовы read и write
    Прототипы системных вызовов
    #include <sys/types.h>
    #include <unistd.h>
    size_t read(int fd, void *addr, size_t nbytes);
    size_t write(int fd, void *addr,size_t nbytes);
    Описание системных вызовов
    Системные вызовы read и write предназначены для осуществления потоковых операций ввода (чтения) и вывода (записи) информации над каналами связи, описываемыми файловыми дескрипторами, т.е. для файлов, pipe, FIFO и socket. Параметр fd является файловым дескриптором созданного ранее потокового канала связи, через который будет отсылаться или получаться информация, т. е. значением, которое
    вернул один из системных вызовов open(), pipe() или socket().
    Параметр addr представляет собой адрес области памяти, начиная с которого будет браться информация для передачи или размещаться принятая информация. Параметр nbytes для системного вызова write определяет количество байт, которое должно быть передано, начиная с адреса памяти addr. Параметр nbytes для системного вызова read определяет количество байт, которое мы хотим получить из канала связи и разместить в памяти, начиная с адреса addr.
    Возвращаемые значения
    В случае успешного завершения системный вызов возвращает количество реально посланных или принятых байт. Заметим, что это значение (большее или равное 0) может не совпадать с заданным значением параметра nbytes, а быть меньше, чем оно, в силу отсутствия места на диске или в линии связи при передаче данных или отсутствия информации при ее приеме. При возникновении какой-либо ошибки возвращается отрицательное значение.
    Особенности поведения при работе с файлами
    При работе с файлами информация записывается в файл или читается из файла, начиная с места, определяемого указателем текущей позиции в файле. Значение указателя увеличивается на количество реально прочитанных или записанных байт. При чтении информации из файла она не пропадает из него. Если системный вызов read возвращает значение 0, то это означает, что файл прочитан до конца. Мы сейчас не акцентируем внимание на понятии указателя текущей позиции в файле ивзаимном влиянии значения этого указателя и поведения системных вызовов.
    После завершения потоковых операций процесс должен выполнить операцию закрытия потока ввода-вывода, во время которой произойдет окончательный сброс буферов на линии связи, освободятся выделенные ресурсы операционной системы, и элемент таблицы открытых файлов, соответствующий файловому дескриптору, будет отмечен как свободный.
    За эти действия отвечает системный вызов close(). Надо отметить, что при завершении работы процесса с помощью явного или неявного вызова функции exit() происходит автоматическое закрытие всех открытых потоков ввода-вывода.
  8. Системный вызов close
    Прототип системного вызова
    #include <unistd.h>
    int close(int fd);
    Описание системного вызова
    Системный вызов close предназначен для корректного завершения работы с файлами и другими объектами ввода-вывода, которые описываются в операционной системе через файловые дескрипторы: pipe, FIFO, socket.
    Параметр fd является дескриптором соответствующего объекта, т. е. значением, которое вернул один из системных вызовов open(), pipe() или socket().
    Возвращаемые значения
    Системный вызов возвращает значение 0 при нормальном завершении и значение -1 при возникновении ошибки.
  9. Общие файлы
    При использовании общих файлов оба процесса открывают один и тот же файл, с помощью которого и обмениваются информацией. Для ускорения работы следует использовать файлы, отображаемые в памяти при помощи системного вызова mmap():
    #include <unistd.h>
    #include <sys/mman.h>
    void * mmap(void *start, size_t length, int prot , int flags, int fd,
    off_t offset);
    Функция mmap отображает length байтов, начиная со смещения offset файла, определенного файловым описателем fd, в память, начиная с адреса start. Последний параметр offset необязателен, и обычно равен 0. Настоящее местоположение отраженных данных возвращается самой функцией mmap, и никогда не бывает равным 0. Аргумент prot описывает
    желаемый режим защиты памяти (он не должен конфликтовать с режимом открытия файла):
    PROT_EXEC данные в памяти могут исполняться;
    PROT_READ данные в памяти можно читать;
    PROT_WRITE в область можно записывать информацию;
    PROT_NONE доступ к этой области памяти запрещен.
    Параметр flags задает тип отражаемого объекта, опции отражения и указывает, принадлежат ли отраженные данные только этому процессу или их могут читать другие. Он состоит из комбинации следующих битов:
    MAP_FIXED использование этой опции не рекомендуется;
    MAP_SHARED разделить использование этого отражения с другими
    процессами, отражающими тот же объект. Запись информации в эту область памяти будет эквивалентна записи в файл. Файл может не обновляться до
    вызова функций msync(2) или munmap(2);
    MAP_PRIVATE создать неразделяемое отражение с механизмом copy-on-
    write. Запись в эту область памяти не влияет на файл. Не определено,
    являются или нет изменения в файле после вызова mmap видимыми в
    отраженном диапазоне.
  10. kill()
    Прототип системного вызова
    #include <sys/types.h>
    #include <signal.h>
    int kill(pid_t pid, int signal);
    Описание системного вызова
    Системный вызов kill() предназначен для передачи сигнала одному или нескольким специфицированным процессам в рамках полномочий пользователя.

    Послать сигнал (если у вас нет полномочий суперпользователя) можно только процессу, у которого эффективный идентификатор пользователя совпадает с эффективным идентификатором пользователя для процесса, посылающего сигнал.
    Аргумент pid описывает, кому посылается сигнал, а аргумент sig — какой сигнал посылается. Этот системный вызов умеет делать много разных вещей, в зависимости от значения аргументов:
    Если pid > 0 и sig > 0, то сигнал номером sig (если позволяют привилегии) посылается процессу с идентификатором pid.
    Если pid = 0, а sig > 0, то сигнал с номером sig посылается всем процессам в группе, к которой принадлежит посылающий процесс.
    Если pid = -1, sig > 0 и посылающий процесс не является процессом суперпользователя, то сигнал посылается всем процессам в системе, для которых идентификатор пользователя совпадает с эффективным идентификатором пользователя процесса, посылающего сигнал.
    Если pid = -1, sig > 0 и посылающий процесс является процессом суперпользователя, то сигнал посылается всем процессам в системе, за исключением системных процессов (обычно всем, кроме процессов с pid = 0 и pid = 1).
    Если pid < 0, но не –1, sig > 0, то сигнал посылается всем процессам из группы, идентификатор которой равен абсолютному значению аргумента pid (если позволяют привилегии).
    Если значение sig = 0, то производится проверка на ошибку, а сигнал не посылается, так как все сигналы имеют номера > 0. Это можно использовать для проверки правильности аргумента pid ( есть ли в системе процесс или группа процессов с соответствующим идентификатором).

    Системный вызов возвращает 0 при нормальном завершении и –1 при ошибке.
  11. pause() - ожидает сигнал 
    СИНТАКСИС
    #include <unistd.h>
    int pause(void); 
    ОПИСАНИЕ
    После вызова функции pause вызывающий процесс (или подзадача) приостанавливается до тех пор, пока не получит сигнал. Данный сигнал либо остановит процесс, либо заставит его вызвать функцию обработки этого сигнала. 
    ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
    Функция pause возвращается только тогда, когда сигнал был перехвачен и произошел возврат из функции обработки сигнала. В этом случае она возвращает -1, а значение переменной errno становится равным EINTR. 
    НАЙДЕННЫЕ ОШИБКИ
    EINTR сигнал был перехвачен и произошел возврат из функции обработки сигнала.
  12. НАЗВАНИЕ
    signal - работа с сигналами ANSI C
    СИНТАКСИС
    #include <signal.h>
    typedef void (*sighandler_t)(int);
    sighandler_t signal(int signum, sighandler_t handler);
    ОПИСАНИЕ
    Системный вызов signal() устанавливает новый обработчик сигнала с номером signum в соответствии с параметром sighandler, который может быть функцией пользователя, SIG_IGN или SIG_DFL. При получении процессом сигнала с номером signum происходит следующее: если устанавливаемое значение обработчика равно SIG_IGN, то сигнал игнорируется; если оно равно SIG_DFL, то выполняются стандартные действия, связанные с сигналом (см. signal(7)). Наконец, если обработчик установлен в функцию sighandler, то сначала устанавливает значение обработчика в SIG_DFL или выполняется зависимая от реализации блокировка сигнала, а затем вызывается функция sighandler с параметром signum.
    Использование функции-обработчика сигнала называется "перехватом сигнала". Сигналы SIGKILL и SIGSTOP не могут быть "перехвачены" или игнорированы.
    ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
    Функция signal() возвращает предыдущее значение обработчика сигнала или SIG_ERR при ошибке. 
    Пример:
    void *my_handler(int nsig)
    {
      /* обработка сигнала */
    }
    ...
    (void) signal(SIGUSR1, (__sighandler_t)my_handler);
    ...

  13.  













Комментариев нет:

Отправить комментарий