Лекции по курсу "Системное программирование для UNIX". Литвинов Д.Г. - 19 стр.

UptoLike

Составители: 

19
Пример создания процесса
Ниже приведен пример того, каким образом можно написать функцию,
идентичную системной функции system. Она выполняет команду используя эквивалент
вызова sh –c COMMAND.
#include <stddef.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
/* Execute the command using this shell program. */
#define SHELL "/bin/sh"
int
my_system (const char *command)
{
int status;
pid_t pid;
pid = fork ();
if (pid == 0)
{
/* это дочерний процесс. Выполняем команду */
execl (SHELL, SHELL, "-c", command, NULL);
_exit (EXIT_FAILURE);
}
else if (pid < 0)
/* создание процесса невозможно */
status = -1;
else
/* родительский процесс. Ожидаем завершения */
if (waitpid (pid, &status, 0) != pid)
status = -1;
return status;
}
Сигналы
Сигналом называется программное прерывание, передаваемое выполняемому
процессу. Операционная система использует сигналы для информирования
выполняемых процессов об исключительных ситуациях.
Все события, генерирующие сигналы могут быть разбиты на три основные
категории: ошибки, внешние события и явные вызовы. Ошибка означает, что программа
выполнила некорректную операцию и не может быть продолжена. К ошибкам, которые
могут генерировать сигналы относятся ошибки деления на ноль и ошибки обращения к
неверным адресам памяти. Внешнее событие вызывается как правило устройствами
ввода-вывода или другими процессами. Непосредственный вызов означает
использование библиотечной функции (например, kill), непосредственным назначением
которой является генерация сигнала.
Сигналы могут генерироваться синхронно и асинхронно. Синхронные сигналы
свойственны некоторым действиям, выполняемым программой и выполняются
непосредственно во время этого действия. К синхронным сигналам относятся
большинство сигналов, сообщающих об ошибках.
Асинхронные сигналы генерируются событиями, происходящими вне
выполняемого процесса и поступают в неизвестный заранее момент времени.
Когда сигнал генерируется, он помещается операционной системой в очередь
ожидания и через некоторое время передается процессу для обработки. Существует
        Пример создания процесса
        Ниже приведен пример того, каким образом можно написать функцию,
идентичную системной функции system. Она выполняет команду используя эквивалент
вызова sh –c COMMAND.
       #include   
       #include   
       #include   
       #include   
       #include   

       /* Execute the command using this shell program.     */
       #define SHELL "/bin/sh"

       int
       my_system (const char *command)
       {
           int status;
           pid_t pid;

           pid = fork ();
           if (pid == 0)
           {
           /* это дочерний процесс. Выполняем команду */
               execl (SHELL, SHELL, "-c", command, NULL);
               _exit (EXIT_FAILURE);
           }
           else if (pid < 0)
           /* создание процесса невозможно */
           status = -1;
           else
           /* родительский процесс. Ожидаем завершения */
           if (waitpid (pid, &status, 0) != pid)
               status = -1;
           return status;
       }

       Сигналы
        Сигналом называется программное прерывание, передаваемое выполняемому
процессу. Операционная система использует сигналы для информирования
выполняемых процессов об исключительных ситуациях.
        Все события, генерирующие сигналы могут быть разбиты на три основные
категории: ошибки, внешние события и явные вызовы. Ошибка означает, что программа
выполнила некорректную операцию и не может быть продолжена. К ошибкам, которые
могут генерировать сигналы относятся ошибки деления на ноль и ошибки обращения к
неверным адресам памяти. Внешнее событие вызывается как правило устройствами
ввода-вывода или другими процессами. Непосредственный вызов означает
использование библиотечной функции (например, kill), непосредственным назначением
которой является генерация сигнала.
        Сигналы могут генерироваться синхронно и асинхронно. Синхронные сигналы
свойственны некоторым действиям, выполняемым программой и выполняются
непосредственно во время этого действия. К синхронным сигналам относятся
большинство сигналов, сообщающих об ошибках.
        Асинхронные сигналы генерируются событиями, происходящими вне
выполняемого процесса и поступают в неизвестный заранее момент времени.
        Когда сигнал генерируется, он помещается операционной системой в очередь
ожидания и через некоторое время передается процессу для обработки. Существует


                                                                              19