Некоторые сигналы можно заблокировать, отложить
Некоторые сигналы можно заблокировать, отложить их обработку, или проигнорировать, для других (например, SIGKILL и SIGSTOP) это невозможно.
Взаимное влияние процессов в UNIX минимизировано (многозадачность!), но система была бы неэффективной, если бы она не позволяла процессам обмениваться данными и сигналами (IPC - Inter Process Communications). Для реализации этой задачи в UNIX предусмотрены:
- каналы
- сигналы
- FIFO (First-In-First-Out - именованные каналы)
- очереди сообщений
- семафоры
- совместно используемые области памяти
- сокеты
Для создания канала используется системный вызов
pipe int pipe(int *filedes); который возвращает два дескриптора файла filedes[0] - для записи в канал и filedes[1] для чтения из канала. Когда один процесс записывает данные в filedes[0], другой получает их из filedes[1]. Здесь уместен вопрос, как этот другой процесс узнает дескриптор filedes[1]?
Нужно вспомнить, что дочерний процесс наследует все дескрипторы файлов родительского процесса. Таким образом, к дескрипторам имеет доступ процесс, сформировавший канал, и все его дочерние процессы, что позволяет работать каналам только между родственными процессами. Для независимых процессов такой метод обмена недоступен. Канальный обмен может быть запущен и с консоли. Например:
cat file.txt | wc
Здесь символ | олицетворяет создание канала между выводом из файла
file.txt и программой
wc, подсчитывающей число символов в словах. Процессы эти не являются независимыми, так как оба порождены процессом
shell.
Метод
FIFO (в BSD не реализован) сходен с канальным обменом, так как также организует лишь однонаправленный обмен. Такие каналы имеют имена, что позволяет их применять при обмене между независимыми процессами.
FIFO - это отдельный тип файла в файловой системе UNIX. Для формирования FIFO используется системный вызов
mknod.
int mknod(char *pathname, int mode, int dev);
где
pathname - имя файла (
FIFO),
mode - флаги владения и прав доступа,
dev - при создании
FIFO игнорируется.
Допускается создание
FIFO и из командной строки:
mknod name p.
Содержание Назад Вперед