- •Утилита make
- •Запуск утилиты make
- •Описание правил
- •Синтаксис правила
- •Интерфейсы прикладного программирования unix и posix
- •. Интерфейсы прикладного программирования posix
- •Общие характеристики интерфейсов прикладного программирования
- •Системные функции управления состоянием процесса
- •Int main()
- •Int main()
- •Сигналы
- •Назначение и основные сведения
- •Типы и имена сигналов
- •Void(*signal(int sig, void(*func)(int)))(int);
- •Int sigaction(int sig, const struct sigaction *act, struct sigaction *oact);
- •Int main( int argc, char** argv)
Int main()
{
sem_t *semp = sem_open("/sem.0", O_CREAT, S_IRWXU, 1);
if (semp==(sem_t*)-1) { perror("sem_open"); return -1; }
if (sem_wait(semp)==-1) perror("sem_wait");
if (sem_post(semp)==-1) perror("sem_post");
if (sem_close(semp)==-1) perror("sem_close");
if (sem_unlink("/sem.0") == -1) perror("sem_unlink");
return 0;
}
Мьютексы
Мьютексы имеют много общего с семафорами. Они также используются для синхронизации потоков управления на основе двух операций:
захват мьютекса (функции pthread_mutex_lock() и pthread_mutex_trylock()),
освобождение мьютекса (функция pthread_mutex_unlock()).
Основные отличия мьютексов от семафоров состоят в следующем. Мьютекс может быть захвачен не более чем одним потоком управления. О потоке управления, который захватил мьютекс, говорят, что он является владельцем мьютекса. Освободить мьютекс может только его владелец. В силу этого мьютексы нельзя использовать в процедурах обработки прерываний.
Мьютексы в отличие от семафоров позволяют избежать инверсии приоритетов. Такое название получил феномен, при котором менее приоритетные потоки управления в силу использования средств синхронизации мешают выполнению более приоритетного потока (подробнее см.Планирование. Планирование и средства синхронизации).
В основном мьютексы используются для управления доступом к ресурсам, совместно используемым разными потоками управления. Операция захвата мьютекса позволяет убедиться, доступен ли требуемый ресурс в настоящее время. Если потоку управления ресурс больше не нужен, то он освобождает мьютекс.
Если мьютекс уже захвачен, то попытка захватить его функцией pthread_mutex_lock()приведет к тому, что текущий поток будет приостановлен (установлен в очередь к мьютексу) до тех пор, пока мьютекс не будет освобожден. В очереди к мьютексу может находиться одновременно несколько потоков управления. Потоки управления, находящиеся в очереди к мьютексу, упорядочены по приоритетам, а потоки, имеющие равный приоритет, упорядочены по времени установки в очередь. Если владелец мьютекса пытается повторно захватить тот же мьютекс, то функция немедленно возвращает управление с соответствующим кодом ошибки.
Если в поток управления, ожидающий мьютекса, доставляется сигнал, то после возврата из обработчика сигнала поток снова переводится в ожидание, как будто оно и не прерывалось.
Функция pthread_mutex_trylock()аналогична функцииpthread_mutex_lock(), но если указанный мьютекс уже захвачен, то функцияpthread_mutex_trylock()немедленно возвращает управление с соответствующим кодом ошибки.
При освобождении мьютекса функция pthread_mutex_unlock()проверяет, есть ли потоки управления, ожидающие освобождения мьютекса. Если такие потоки есть, то среди них выбирается наиболее приоритетный, а среди потоков с наибольшим приоритетом выбирается тот, который дольше других ждет захвата мьютекса. Этот поток объявляется работоспособным и становится владельцем мьютекса.
Сигналы
Сигналы асинхронно меняют ход выполнения задачи. Любая задача или процедура обслуживания прерываний может "выставить" (или послать) сигнал определенной задаче. Задача, получившая сигнал, немедленно изменяет ход выполнения: вызывается специальный "обработчик сигналов", связанный с данной задачей. Обработчик сигнала - это пользовательская процедура, связанная с конкретным сигналом и выполняющая некоторые действия всякий раз, когда поступает этот сигнал.