Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Материалы / MAKE_posix_creprc_sem_sig.DOC
Скачиваний:
27
Добавлен:
01.05.2014
Размер:
146.94 Кб
Скачать

Int main()

{

switch (fork()) {

case (pid_t)-1: perror("fork"); /* fork fails */

break;

case (pid_t)0: cout << "Child process created\n";

return 0;

default: cout << "Parent process after fork\n";

}

return 0;

}

/* test_exit*/

#include <iostream.h>

#include <unistd.h>

int main()

{

cout << "Test program for _exit" << endl;

_exit(0);

return 0;

}

/* test_waitpid*/

#include <iostream.h>

#include <stdio.h>

#include <sys/types.h>

#include <sys/wait.h>

#include <unistd.h>

int main()

{

pid_t child_pid, pid;

int status;

switch (child_pid=fork())

{

case (pid_t)-1: perror("fork"); /* fork fails */

break;

case (pid_t)0: cout << "Child process created\n";

_exit(15); /* terminate child */

default: cout << "Parent process after fork\n";

pid = waitpid(child_pid,&status,WUNTRACED);

}

if (WIFEXITED(status))

cerr << child_pid << " exits: " <<WEXITSTATUS(status) << endl;

else if (WIFSTOPPED(status))

cerr << child_pid << " stopped by: " <<WSTOPSIG(status) << endl;

else if (WIFSIGNALED(status))

cerr << child_pid << " killed by: " <<WTERMSIG(status) << endl;

else perror("waitpid");

_exit(0);

return 0;

}

/*page 217*/

/* test_exec*/

#include <iostream.h>

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

#include <sys/types.h>

#include <sys/wait.h>

#include <unistd.h>

int System( const char *cmd) // emulate the C system function

{

pid_t pid;

int status;

switch (pid=fork())

{

case -1: return -1;

case 0: execl("/bin/sh", "sh", "-c", cmd, 0);

perror("execl");

exit(errno);

}

if (waitpid(pid,&status,0)==pid && WIFEXITED(status))

return WEXITSTATUS(status);

return -1;

}

int main()

{

int rc = 0;

char buf[256];

do

{

printf("sh> "); fflush(stdout);

if (!gets(buf)) break;

rc = System(buf);

} while (!rc);

return (rc);

}

/*page 224*/

Семафоры

Семафоры обеспечивают две основные операции:

  • захват семафора (функции sem_wait()иsem_trywait()),

  • освобождение семафора (функция sem_post()).

В обеих операциях используется счетчик семафора - целое число, начальное значение которого определяется при создании семафора. Начальное значение определяет максимальное количество потоков управления, которые могут одновременно захватить семафор.

При захвате семафора вначале проверяется счетчик семафора. Если значение счетчика больше нуля, то оно уменьшается на 1, и семафор считается захваченным. Если счетчик равен 0, то это означает, что в настоящее время семафор не может быть захвачен. В таком случае функция sem_wait()приостанавливает поток управления (устанавливает его в очередь к семафору) до освобождения семафора. Функцияsem_trywait()аналогична функцииsem_wait(), но если семафор не может быть захвачен, то функцияsem_trywait()не устанавливает поток управления в очередь, а возвращает управление с кодом ошибки "семафор не захвачен". В очереди к семафору может находиться одновременно несколько потоков управления. Потоки управления, находящиеся в очереди, упорядочены по приоритетам, а потоки, имеющие равный приоритет, упорядочены по времени установки в очередь.

При освобождении семафора вначале проверяется, имеются ли потоки, ожидающие освобождения семафора. Если таких потоков нет, счетчик семафора увеличивается на 1. В противном случае значение счетчика не меняется, а из очереди к семафору выбирается первый (наиболее приоритетный) поток управления и объявляется работоспособным.

Важным примером использования семафоров является управление доступом к ресурсам, совместно используемым разными потоками управления, например, к общим переменным. В этом случае начальное значение счетчика семафора равно 1, то есть в каждый момент времени доступ к ресурсу может иметь не более одного потока. Операция захвата семафора позволяет убедиться, доступен ли требуемый ресурс в настоящее время. Если потоку управления больше не нужен ресурс, то он освобождает соответствующий семафор.

Использование семафоров обеспечит безопасное использование ресурса только в том случае, если все потоки управления будут захватывать семафор перед использованием ресурса, и освобождать его, как только необходимость в нем отпадет. За взаимосвязь ресурсов и семафоров отвечает прикладная программа.

В качестве второго примера использования семафоров рассмотрим следующую модель. Пусть один или несколько потоков управления собирают данные, а другие протоки их обрабатывают. В этом случае поток первого типа освобождает семафор, как только он подготовил очередную порцию информации для обработки, а поток второго типа захватывает семафор, перед тем как начать обработку очередной порции информации. Если в начале работы нет данных, которые нуждаются в обработке, то начальное значение счетчика семафора равно 0.

Отметим, что освобождать семафор могут не только те потоки, которые его захватывали. Более того, освобождать семафор можно из процедур обработки прерываний и процедур обработки сигналов.

#include <stdio.h>

#include <sys/stat.h>

#include <semaphore.h>

Соседние файлы в папке Материалы