И. Г. Алексеев, А. П. Занкович 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

И. Г. Алексеев, А. П. Занкович



И. Г. Алексеев, А. П. Занкович

 

 

Минск 2008


 

СОДЕРЖАНИЕ

1. Краткие теоретические сведения…………………………………..………4

2. Лабораторные работы

Лабораторная работа №1. Система команд и файловая структура ОС

Unix/Linux ……………………………………………………………………5

Лабораторная работа №2. Управление ОС Linux с

помощью интерпретатора BASH…….…….………….………….……….11

Лабораторная работа №3. Основные принципы программирования

в ОС Unix/Linux ……………………………………………………………15

 

Лабораторная работа №4. Процессы и потоки в ОС Unix/Linux ………17

Лабораторная работа №5. Процессы и потоки в ОС Windows ………...22

Лабораторная работа №6. Средства межпроцессного взаимодействия

ОС …………………………………………………….……..………………23

Литература………………………………………………………………..…29

 

 

КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

 

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

При вытесняющей многозадачности функции планирования потоков целиком сосредоточены в операционной системе и каждому потоку для выполнения предоставляется поочередно ограниченный непрерывный период процессорного времени – квант. Поток или процесс, который исчерпал свой квант, переводится в состояние готовности и ожидает, когда ему будет предоставлен новый квант процессорного времени, а на выполнение выбирается новый поток или процесс из очереди готовых для выполнения. Выделяемые кванты времени могут быть одинаковыми или различными для всех потоков или процессов. Величина кванта обычно выбирается небольшой (не больше 6~16 миллисекунд), чтобы пользователь не ощущал присутствия в системе одновременно нескольких десятков процессов. Смена активного потока происходит, если поток завершился и покинул систему, произошла ошибка, поток перешел в состояние ожидания, исчерпан квант процессорного времени, отведенный данному потоку. На рис. 1 показана упрощённая схема работы системы управления процессами с помощью двух очередей.

 

Рис. 1. Реализация системы управления процессами с помощью двух очередей.

2 ЛАБОРАТОРНЫЕ РАБОТЫ

Лабораторная работа №1

Система команд и файловая структура ОС UNix/Linux

Цель работы: – изучение команд ОС для работы с файлами, каталогами, дисками, системной датой и временем; текстового редактора Kate и файлового менеджера Midnight Commander.

Теоретическая часть

 

Операционная система ОС Linux создана на основе ОС UNIX и во многом имеет схожую структуру и систему команд. Пользователь может работать в текстовом режиме с помощью командной строки, или с использованием графического интерфейса X Window и одного из менеджеров рабочего стола (например, KDE или GNOME). Причем, одновременно в системе могут работать 7 пользователей (6- в текстовом режиме консоли и 1 – в графическом режиме), переключение между пользователями осуществляется по нажатию клавиш:

.

 

В табл. 1 приведены основные команды системы

Таблица 1

Команда Аргументы/ключи Пример Описание
dir каталог dir dir /home Выводит на консоль содержимое каталога
ls -all и другие (см. man) ls -all Выводит на консоль содержимое каталога
ps -a -x и другие (см. man) ps -a Выводит на консоль список процессов
mkdir имя каталога mkdir stud11 Создает каталог
rmdir имя каталога rmdir stud11 Удаляет каталог
rm файл rm myfile1 Удаляет файл
mv файл новое_имя mv myfile1 myf1 Переименование файла
cat файл cat 1.txt Вывод файла на консоль
cd имя каталога cd home Переход по каталогам
grep (см. man) grep "^a" "words.txt" Поиск строки в файле
kill pid процесса kill 12045 Уничтожает процесс
top     Выводит на консоль список процессов
htop     Выводит на консоль полный список запущенных процессов
su     Переход в режим root
chmod права_доступа файл chmod 777 1.txt Изменение прав доступа к файлам
mount устройство каталог mount /dev/cdrom /MyCD Монтирование устройств
dd if= файл of= файл bs=n count=n dd if=/dev/hda1 of=/F.bin bs=512 count=1 Копирование побайтное
ln файл1 файл2 -l ln файл1 файл2 ln –l файл1 файл2 Создать жёсткую или символическую ссылку на файл
uname -a uname -a Информация о системе
find find файл find /home a1.txt Поиск файлов
man   man fgetc Справка по системе
info   info fgetc Справка по системе

 

Linux и Windows используют различные файловые системы для хранения и организации доступа к информации на дисках. В Linux используются файловые системы- Ext2/Ext3, RaiserFS и другие. Все файловые системы имеют поддержку журналирования. Журналируемая файловая система сначала записывает изменения, которые она будет проводить в отдельную часть файловой системы (журнал) и только потом вносит необходимые изменения в остальную часть файловой системы. После удачного выполнения всех транзакций, записи удаляются из журнала. Это обеспечивает лучшее сохранение целостности системы и уменьшает вероятность потери данных. Следует отметить, что Linux поддерживает доступ к Windows -разделам.

Файловая система Linux имеет лишь один корневой каталог, который обозначается косой чертой (/). В файловой структуре Linux нет дисков A, B, C, D …., а есть только каталоги. В Linux различаются прописные и строчные буквы в командах, именах файлов и каталогов. В Windows у каждого файла существует лишь одно имя, в Linux их может быть много. Это – «жесткие» ссылки, которые указывают непосредственно на индексный дескриптор файла. Жесткая ссылка – это один из принципов организации файловой системы Linux.

Для выполнения операций записи и чтения данных в существующем файле его следует открыть при помощи вызова open(). Ниже приведено описание этого вызова:

int open (const char *pathname, int flags, [mode_t mode]);

int fopen (const char *pathname, int flags, [mode_t mode]);

Второй аргумент системного вызова open - flag s - имеет целочисленный тип и определяет метод доступа. Параметр flags принимает одно из значений, заданных постоянными в заголовочном файле fcnt1.h. В файле определены три постоянных:

O_RDONLY – открыть файл только для чтения,

O_WRONLY – открыть файл только для записи,

O_RDWR – открыть файл для чтения и записи,

или “r”, “w”, “rw” для fopen().

Третий параметр mode устанавливает права доступа к файлуи является необязательным, он используется только вместе с флагом O_CREAT. Пример создания нового файла:

# include <sys / types.h>

# include <sys / stat.h>

# include <fcnt1.h>

int Fd1;

FILE *F1;

F1=fopen (“Myfile2.txt”, “w”, 644);

Fd1=open (“Myfile1.txt”, O_CREAT, 644);

Системные вызовы sta t и fstat позволяют процессу определить значения свойств в существующем файле.

#include <sys/types.h>

#include <sys/stat.h>

int stat (const char *pathname, struct stat *buf);

int fstat (int filedes, struct stat *buf);

Где pathname – полное имя файла, buf –структура типа stat. Эта структура после успешного вызова будет содержать связанную с файлом информацию.

Поля структуры stat включает следующие элементы:

struct stat {

dev_t st_dev; /* логическое устройство, где находится файл */

ino_t st_ino; /* номер индексного дескриптора */

mode_t st_mode; /* права доступа к файлу */

nlink_t st_nlink; /* количество жестких ссылок на файл */

uid_t st_uid; /* ID пользователя-владельца */

gid_t st_gid; /* ID группы-владельца */

dev_t st_rdev; /* тип устройства */

off_t st_size; /* общий размер в байтах */

unsigned long st_blksize; /* размер блока ввода-вывода */

unsigned long st_blocks; /* число блоков, занимаемых файлом */

time_t st_atime; /* время последнего доступа */

time_t st_mtime; /* время последней модификации */

time_t st_ctime; /* время последнего изменения */

};

Права доступа в Linux. Права доступа к файлам представлены в виде последовательности бит, где каждый бит означает разрешение на запись (w), чтение (r) или выполнение (x). Права доступа записываются для владельца-создателя файла (owner); группы, к которой принадлежит владелец–создатель файла (group); и всех остальных (other). Например, при выводе команды dir запись типа:

- rwx r-x r-w 1.exe

означает, что владелец файла 1.exe имеет права на чтение, запись и выполнение, группа имеет права только на чтение и выполнение, все остальные имеют права только на чтение. В восьмеричном виде получится значение 0754. В действительности манипулирует файлами не сам пользователь, а запущенный им процесс. Для просмотра прав доступа можно использовать функцию stat.

Пример: stat(“1.exe”, &st1);

Для записи прав доступа служит функция chmod:

#include <sys/types.h>

#include <sys/stat.h>

int chmod(const char *pathname, mode_t mode);

Пример: chmod(“1.exe”, 0777);

Структура каталогов ОС Linux представлена в табл. 2. Есть также несколько полезных сокращений для имен каталогов:

  • Одиночная точка (.) обозначает текущий рабочий каталог.
  • Две точки (..) обозначают родительский каталог текущего рабочего.
  • Тильда (~) обозначает домашний каталог пользователя (обычно это каталог, который является текущим рабочим при запуске Bash).

 

Таблица 2

/ Корневой каталог
/bin Содержит исполняемые файлы самых необходимых для работы системы программ. Каталог /bin не содержит подкаталогов.
/boot Здесь находятся само ядро системы (файл vmlinuz -...) и файлы, необходимые для его загрузки.
/dev Каталог /dev содержит файлы устройств (драйверы).
/etc Это каталог конфигурационных файлов, т. е. файлов, содержащих информацию о настройках системы (например, настройки программ).
/home Содержит домашние каталоги пользователей системы.
/lib Здесь находятся библиотеки (функции, необходимые многим программам).
/media Содержит подкаталоги, которые используются как точки монтирования для сменных устройств (CD-ROM'ов, floppy-дисков и др.)
/mnt Данный каталог (или его подкаталоги) может служить точкой монтирования для временно подключаемых файловых систем.
/proc Содержит файлы с информацией о выполняющихся в системе процессах.
/root Это домашний каталог администратора системы.
/sbin Содержит исполняемые программы, как и каталог /bin. Однако использовать программы, находящиеся в этом каталоге может только администратор системы (root).
/tmp Каталог для временных файлов, хранящих промежуточные данные, необходимых для работы тех или иных программ, и удаляющиеся после завершения работы программ.
/usr Каталог для большинства программ, которые не имеют значения для загрузки системы. Структура этого каталога фактически дублирует структуру корневого каталога.
/var Содержит данные, которые были получены в процессе работы одних программ и должны быть переданы другим, и файлы журналов со сведениями о работе системы.

 

Порядок выполнения работы

1. Изучить теоретическую часть лабораторной работы.

2. В консольном режиме создать, используя команды из табл.1, в домашней папке подкаталог: /номер_группы/ФИО_студента, где в дальнейшем будут храниться все файлы студента. Перейти в корневой каталог и вывести его содержимое используя команды dir и ls –all, проанализировать различия.

3. Проверить действие команд ps, ps –x, top, htop. Найти в справочной системе используя команду man справку по функциям fprintf, fputc и команде ls.

4. В текстовом редакторе joe (вызов: joe 1.c) написать программу 1.c, выводящую на экран фразу “HELLO SUSE Linux”. Компилировать полученную программу компилятором gcc

Gcc 1.c –o 1.exe

Запустить полученный файл 1.exe на выполнение:

./1.exe

Варианты индивидуальных заданий

Во всех заданиях необходимо для чтения или записи файла использовать функции посимвольного ввода вывода fgetc(), fputc() или getc(), putc(). Должен быть контроль ошибок открытия, закрытия, чтения и записи файла или каталога. Вывод сообщений об ошибках должен производиться в стандартный поток вывода сообщений об ошибках (stderr) в следующем виде: имя_модуля: текст_сообщения. Имя модуля берётся из аргументов командной строки.

1. Программа ввода символов с клавиатуры и записи их в файл (имя файла вводится в качестве аргумента при запуске программы). Предусмотреть выход после ввода определённого символа (например: ctrl-F).

2. Программа просмотра текстового файла и вывода его содержимого на экран (имя файла передаётся в качестве аргумента при запуске программы, второй аргумент N устанавливает вывод по группам строк (по N –строк) или сплошным текстом (N =0)).

3. Программа копирования одного файла в другой, имена файлов передаются в качестве аргументов командной строки при запуске программы. Предусмотреть копирование прав доступа к файлу.

4. Программа подсчёта числа отображаемых символов в строках текстового файла. Результаты подсчёта записываются во второй текстовый файл (имена файлов передаются в качестве аргументов командной строки при запуске программы). Пример работы программы:

исходный текстовый файл из 3-х строк:

QWER

REEEt

WEEEEEEERSIIIONN

файл, полученный в результате работы программы:

1. 4

2. 15

3. 16

Итого: 3 строки 35 символов

5. Программа подсчёта числа слов в текстовом файле. Результаты подсчёта записываются во второй текстовый файл (имена файлов передаются в качестве аргументов командной строки при запуске программы). Пример вывода программы для текстового файла:

QWER REEEt

WE E EEE EER SI I IO NN

файл, полученный в результате работы программы:

Итого: 25 символов

 

Лабораторная работа №2

Теоретическая часть

Bash - это sh -совместимый интерпретатор командного языка, выполняющий команды, прочитанные со стандартного входного потока или из файла. Скрипт-файл – это обычный текстовый файл, содержащий последовательность команд bash, для которого установлены права на выполнение. Пример скрипта, выводящего содержимое текущего каталога на консоль и в файл:

#!/bin/bash

Dir

dir > 1.txt

Следующие переменные используются командным интерпретатором.

$0,$1,S2,$3… Значения аргументов командной строки при запуске скрипта. Где $0 -имя самого файла скрипта, $1 - первый аргумент, $2 - второй аргумент, и т.д.  
$@ Все аргументы командной строки, каждый в кавычках  
$? Код возврата последней команды
     
     
           

Пример простого скрипта, выводящего на консоль и в файл содержимое каталога, где имя каталога передаётся скрипту в качестве аргументов при запуске:

Запуск скрипта: >./mydir/home/stud

Скрипт:

#!/bin/bash

dir $1

dir $1 > 1.txt

Можно создать собственную переменную и присвоить ей значение:

A=121

A=”121”

let A=121

let “A=А+1”

Вывод значения на консоль: echo $A

Проверка условия: test[expr]

где expr: а) для строк: S1 = S2S1 содержит S2

S1 != S2S1 не содержит S2

-n S1 если длина S1 >0

-z S1 если длина S1 =0

б) целые i1 и i2

i1 – ge i2

i1 – gt i2

i1 – ie i2

i1 – et i2

i1 – nt i2

в) файлы

-d name_file является ли файл каталогом

-f name_file является ли файл обычным файлом

-r name_file доступен ли файл для чтения

-s name_file имеет ли файл ненулевую длину

-w name_file доступен ли файл для записи

-x name_file является ли файл исполняемым

г) логически операции

!exp логическое отрицание (не)

exp1 –a exp2 умножение условий (и)

exp1 –o exp2 сложение условий (или)

Проверка условия: if [expr ]

then com 1 Если условие expr=true то команда

… com 1… com n

Com n

(elif expr2

Com1

Com n

)

Else

Com 1

Com n

fi

Проверка нескольких условий: case string1 in

Str 1)

Com 1

Com n

;;

Str 2)

Com 1

Com n

;;

Str 3)

Com 1

Com n

;;

*) // default

Com 1

Com n

;;

Esac

Функция пользователя: fname2 (arg1,arg2...argN)

{
commands
}

Организация циклов:

1. for var1 in list

do

Com1

Com n

Done

2. while exp

Com1

Com n

End

3. until exp // аналог do-while

do

Com1

Com n

Done

Порядок выполнения работы

1. Изучить теоретическую часть лабораторной работы.

2. Написать скрипт, выводящий на консоль и в файл все аргументы командной строки.

3. Написать скрипт, выводящий в файл (имя файла задаётся пользователем в качестве первого аргумента командной строки) имена всех файлов с заданным расширением (третий аргумент командной строки) из заданного каталога (имя каталога задаётся пользователем в качестве второго аргумента командной строки).

4. Написать скрипт, компилирующий и запускающий программу (имя исходного файла и exe- файла результата задаётся пользователем в качестве аргументов командной строки). В случае ошибок при компиляции вывести на консоль сообщение об ошибках и не запускать программу на выполнение.

 

Варианты индивидуальных заданий

 

1. Написать скрипт для поиска файлов заданного размера в заданном каталоге (имя каталога задаётся пользователем в качестве третьего аргумента командной строки). Диапазон (мин.- мах.) размеров файлов задаётся пользователем в качестве первого и второго аргумента командной строки.

2. Написать скрипт с использованием цикла for, выводящий на консоль размеры и права доступа для всех файлов в заданном каталоге и всех его подкаталогах (имя каталога задается пользователем в качестве первого аргумента командной строки).

3. Написать скрипт для поиска заданной пользователем строки во всех файлах заданного каталога и всех его подкаталогов (строка и имя каталога задаются пользователем в качестве первого и второго аргумента командной строки). На консоль выводятся полный путь и имена файлов, в содержимом которых присутствует заданная строка, и их размер. Если к какому либо каталогу нет доступа, необходимо вывести соответсвующее сообщение и продолжить выполнение.

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

5. Написать скрипт находящий в заданном каталоге и всех его подкаталогах все файлы, владельцем которых является заданный пользователь. Имя владельца и каталог задаются пользователем в качестве первого и второго аргумента командной строки. Скрипт выводит результаты в файл (третий аргумент командной строки) в виде полный путь, имя файла, его размер. На консоль выводится общее число просмотренных файлов.

6. Написать скрипт находящий в заданном каталоге и всех его подкаталогах все файлы, заданного размера в заданном каталоге (имя каталога задаётся пользователем в качестве третьего аргумента командной строки). Диапазон (мин.- мах.) размеров файлов задаётся пользователем в качестве первого и второго аргумента командной строки. Имя владельца и каталог задаются пользователем в качестве первого и второго аргумента командной строки. Скрипт выводит результаты поиска в файл (четвертый аргумент командной строки) в виде полный путь, имя файла, его размер. На консоль выводится общее число просмотренных файлов.

7. Написать скрипт подсчитавающий суммарный размер файлов в заданном каталоге и всех его подкаталогах (имя каталога задаётся пользователем в качестве аргумента командной строки). Скрипт выводит результаты посдчета в файл (второй аргумент командной строки) в виде католог(полный путь), суммарный размер файлов число просмотренных файлов.

 

Лабораторная работа №3

Теоретическая часть

Каталоги в ОС Linux –это особые файлы. Для открытия или закрытия каталогов существуют вызовы:

#include <dirent.h> DIR *opendir (const char *dirname); int closedir(DIR *dirptr); Для чтения записей каталога существует вызов: struct dirent *readdir(DIR *dirptr); Структура dirent такова: struct dirent { long d_ino; off_t d_off; unsigned short d_reclen; char d_name [1]; }; Поле d_ino - это число, которое уникально для каждого файла в файловой системе. Значением поля d_off служит смещение данного элемента в реальном каталоге. Поле d_name есть начало массива символов, задающего имя элемента каталога. Данное имя ограничено нулевым байтом и может содержать не более MAXNAMLEN символов. Тем самым описываемая структура имеет переменную длину, хранящуюся в поле d_reclen. Пример вызова: DIR *dp; struct dirent *d; d=readdir(dp); При первом вызове функция readdir в структуру dirent будет считана первая запись каталога. После прочтения всего каталога в результате последующих вызовов readdir будет возвращено значение NULL. Для возврата указателя в начало каталога на первую запись существует вызов: void rewindir(DIR *dirptr); Чтобы получить имя текущего рабочего каталога существует функция: char *getcwd(char *name, size_t size);

Порядок выполнения работы

 

1. Изучить теоретическую часть работы.

2. Написать программу вывода на экран содержимого заданного пользователем каталога. Вывести с использованием программы содержимое текущего и корневого каталога. Предусмотреть контроль ошибок открытия, закрытия, чтения каталога. Вывод сообщений об ошибках должен производиться в стандартный поток вывода сообщений об ошибках (stderr) в следующем виде: имя_модуля текст_сообщения.

 

Варианты индивидуальных заданий

Должен быть контроль ошибок для всех операций с файлами и каталогами.

1. Отсортировать в заданном каталоге (аргумент 1 командной строки) и во всех его подкаталогах файлы по следующим критериям (аргумент 2 командной строки, задаётся в виде целого числа):1 – по размеру файла, 2 – по имени файла. Записать отсортированные файлы в новый каталог (аргумент 3 командной строки).

2. Найти в заданном каталоге (аргумент 1 командной строки) и всех его подкаталогах заданный файл (аргумент 2 командной строки). Вывести на консоль полный путь к файлу имя файла, его размер, дату создания, права доступа, номер индексного дескриптора. Вывести также общее количество просмотренных каталогов и файлов.

3. Для заданного каталога (аргумент 1 командной строки) и всех его подкаталогов вывести в заданный файл (аргумент 2 командной строки) и на консоль имена файлов, их размер и дату создания, удовлетворяющих заданным условиям: 1 – размер файла находится в заданных пределах от N1 до N2 (N1,N2 задаются в аргументах командной строки), 2 – дата создания находится в заданных пределах от M1 до M2 (M1, M2 задаются в аргументах командной строки).

4. Найти совпадающие по содержимому файлы в двух заданных каталогах (аргументы 1 и 2 командной строки) и всех их подкаталогах. Вывести на консоль и в файл (аргумент 3 командной строки) их имя, размер, дату создания, права доступа, номер индексного дескриптора.

5. Подсчитать суммарный размер файлов в заданном каталоге (аргумент 1 командной строки) и для каждого его подкаталога отдельно. Вывести на консоль и в файл (аргумент 2 командной строки) название подкаталога, количество файлов в нём, суммарный размер файлов, имя файла с наибольшим размером.

6. Написать программу, находящую в заданном каталоге и всех его подкаталогах все файлы, заданного размера в заданном каталоге (имя каталога задаётся пользователем в качестве третьего аргумента командной строки). Диапазон мин. мах. размеров файлов задаётся пользователем в качестве первого и второго аргумента командной строки. Имя владельца и каталог задаются пользователем в качестве первого и второго аргумента командной строки. Программа выводит результаты поиска в файл (четвертый аргумент командной строки) в виде полный путь, имя файла, его размер. На консоль выводится общее число просмотренных файлов.

 

Лабораторная работа №4

Теоретическая часть

В ОС Linux для создания процессов используется системный вызов fork():

#include <sys/types.h>

#include <unistd.h>

pid_t fork (void);

В результате успешного вызова fork() ядро создаёт новый процесс, который является почти точной копией вызывающего процесса. Другими словами, новый процесс выполняет копию той же программы, что и создавший его процесс, при этом все его объекты данных имеют те же самые значения, что и в вызывающем процессе.

Созданный процесс называется дочерним процессом, а процесс, осуществивший вызов fork(), называется родительским. После вызова родительский процесс и его вновь созданный потомок выполняются одновременно, при этом оба процесса продолжают выполнение с оператора, который следует сразу же за вызовом fork(). Процессы выполняются в разных адресных пространствах, поэтому прямой доступ к переменным одного процесса из другого процесса невозможен.

Следующая короткая программа более наглядно показывает работу вызова fork() и использование процесса:

#include <stdio.h>

#include <unistd.h>

Int main ()

{

pid_t pid; /* идентификатор процесса */

printf (“Пока всего один процесс\n”);

pid = fork (); /* Создание нового процесса */

printf (“Уже два процесса\n”);

if (pid = = 0)

{

printf (“Это Дочерний процесс его pid=%d\n”, getpid());

printf (“А pid его Родительского процесса=%d\n”, getppid());

}

else if (pid > 0)

printf (“Это Родительский процесс pid=%d\n”, getpid());

Else

printf (“Ошибка вызова fork, потомок не создан\n”);

}

Для корректного завершения дочернего процесса в родительском процессе необходимо использовать функцию wait() или waitpid():

pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);

Функция wait приостанавливает выполнение родительского процесса до тех пор, пока дочерний процесс не прекратит выполнение или до появления сигнала, который либо завершает текущий процесс, либо требует вызвать функцию-обработчик. Если дочерний процесс к моменту вызова функции уже завершился (так называемый «зомби»), то функция немедленно возвращается. Системные ресурсы, связанные с дочерним процессом, освобождаются.

Функция waitpid приостанавливает выполнение родительского процесса до тех пор, пока дочерний процесс, указанный в параметре pid, не завершит выполнение, или пока не появится сигнал, который либо завершает родительский процесс, либо требует вызвать функцию-обработчик. Если указанный дочерний процесс к моменту вызова функции уже завершился (так называемый «зомби»), то функция немедленно возвращается. Системные ресурсы, связанные с дочерним процессом, освобождаются. Параметр pid может принимать несколько значений:

pid<-1 означает, что нужно ждать любого дочернего процесса, чей идентификатор группы процессов равен абсолютному значению pid.

pid=-1 означает ожидать любого дочернего процесса; функция wait ведет себя точно так же.

pid =0 означает ожидать любого дочернего процесса, чей идентификатор группы процессов равен таковому у текущего процесса.

pid>0 означает ожидать дочернего процесса, чем идентификатор равен pid.

Значение options создается путем битовой операции ИЛИ над следующими константами:

WNOHANG - означает вернуть управление немедленно, если ни один дочерний процесс не завершил выполнение.

WUNTRACED -означает возвращать управление также для остановленных дочерних процессов, о чьем статусе еще не было сообщено.

Каждый дочерний процесс при завершении работы посылает своему процессу-родителю специальный сигнал SIGCHLD, на который у всех процессов по умолчанию установлена реакция "игнорировать сигнал". Наличие такого сигнала совместно с системным вызовом waitpid() позволяет организовать асинхронный сбор информации о статусе завершившихся порожденных процессов процессом-родителем.

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

int execl(char *pathname, char *arg0, arg1,..., argn, NULL);

int execle(char *pathname, char *arg0, arg1,..., argn, NULL, char **envp);

int execlp(char *pathname, char *arg0, arg1,..., argn, NULL);

int execlpe(char *pathname, char *arg0, arg1,..., argn, NULL, char **envp);

int execv(char *pathname, char *argv[]);

int execve(char *pathname, char *argv[],char **envp);

int execvp(char *pathname, char *argv[]);

int execvpe(char *pathname, char *argv[],char **envp);

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

#include <pthread.h>

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,

void *(*start_routine)(void*), void *arg);

Функция создает новую нить в которой выполняется функция пользователя start_routine,передавая ей в качестве аргумента параметр arg. Если требуется передать более одного параметра, они собираются в структуру, и передается адрес этой структуры.При удачном вызове функция pthread_create возвращает значение 0 и помещает идентификатор новой нити исполнения по адресу, на который указывает параметр thread. В случае ошибки возвращается положительное значение, которое определяет код ошибки, описанный в файле <errno.h>. Значение системной переменной errno при этом не устанавливается. Параметр attr служит для задания различных атрибутов создаваемой нити. Функция нити должна иметь заголовок вида:

void * start_routine (void *)

Завершение функции потока происходит если:

· функция нити вызвала функцию pthread_exit();

· функц



Поделиться:


Последнее изменение этой страницы: 2016-08-16; просмотров: 818; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 52.14.130.13 (0.232 с.)