Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
И. Г. Алексеев, А. П. ЗанковичСтр 1 из 4Следующая ⇒
И. Г. Алексеев, А. П. Занкович
Минск 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
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. Есть также несколько полезных сокращений для имен каталогов:
Таблица 2
Порядок выполнения работы 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 Следующие переменные используются командным интерпретатором.
Пример простого скрипта, выводящего на консоль и в файл содержимое каталога, где имя каталога передаётся скрипту в качестве аргументов при запуске: Запуск скрипта: >./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) { Организация циклов: 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); Функция 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; просмотров: 821; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.149.214.32 (1.236 с.) |