-->

Основы программирования в Linux

На нашем литературном портале можно бесплатно читать книгу Основы программирования в Linux, Мэтью Нейл-- . Жанр: Программирование / ОС и Сети. Онлайн библиотека дает возможность прочитать весь текст и даже без регистрации и СМС подтверждения на нашем литературном портале bazaknig.info.
Основы программирования в Linux
Название: Основы программирования в Linux
Дата добавления: 16 январь 2020
Количество просмотров: 669
Читать онлайн

Основы программирования в Linux читать книгу онлайн

Основы программирования в Linux - читать бесплатно онлайн , автор Мэтью Нейл
В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стан­дартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым. Для начинающих Linux-программистов

Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала

Перейти на страницу:

#include <unistd.h>

#include <stdlib.h>

#include <pthread.h>

void *thread_function(void *arg);

char message[] = "Hello World";

int thread_finished = 0;

int main() {

 int res;

 pthread_t a_thread;

 pthread_attr_t thread_attr;

 res = pthread_attr_init(&thread_attr);

 if (res != 0) {

  perror("Attribute creation failed");

  exit(EXIT_FAILURE);

 }

 res = pthread_attr_setdetachstate(&thread_attr,

  PTHREAD_CREATE_DETACHED);

 if (res != 0) {

  perror("Setting detached attribute failed");

  exit(EXIT_FAILURE);

 }

 res = pthread_create(&a_thread, &thread_attr,

  thread_function, (void *)message);

 if (res != 0) {

  perror("Thread creation failed");

  exit(EXIT_FAILURE);

 }

 (void)pthread_attr_destroy(&thread_attr);

 while (!thread_finished) {

  printf("Waiting for thread to say it's finished...n");

  sleep(1);

 }

 printf("Other thread finished, bye!n");

 exit(EXIT_SUCCESS);

}

void *thread_function(void *arg) {

 printf("thread_function is running. Argument was %sn", (char *)arg);

 sleep(4);

 printf("Second thread setting finished flag, and exiting nown");

 thread_finished = 1;

 pthread_exit(NULL);

}

Вывод не принесет сюрпризов:

$ <b>./threads</b>

Waiting for thread to say it's finished...

thread_function is running. Argument was Hello World

Waiting for thread to say it's finished...

Waiting for thread to say it's finished...

Waiting for thread to say it's finished...

Second thread setting finished flag, and exiting now

Other thread finished, bye!

Как видите, установка отсоединенного состояния позволяет второму потоку завершиться независимо, без необходимости исходному потоку ждать этого события.

Как это работает

В исходном тексте программы два важных фрагмента:

pthread_attr_t thread_attr;

res = pthread_attr_init(&amp;thread_attr);

if (res != 0) {

 perror(&quot;Attribute creation failed&quot;);

 exit(EXIT_FAILURE);

}

который объявляет атрибут потока и инициализирует его, и

res = pthread_attr_setdetachstatе(&amp;thread_attr, PTHREAD_CREATE_DETACHED);

if (res != 0) {

 perror(&quot;Setting detached attribute failed&quot;);

 exit(EXIT_FAILURE);

}

который устанавливает значения атрибутов для задания отсоединенного состояния потока.

К другим незначительным отличиям относится создание потока с передачей адреса атрибутов:

res = pthread_create(&amp;a_thread, &amp;thread_attr, thread_function, (void*)message);

и для завершенности уничтожение атрибутов после их использования:

pthread_attr_destroy(&amp;thread_attr);

Атрибуты планирования потока

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

sched_get_priority_max
и
sched_get_priority_min
.

Выполните упражнение 12.6.

Упражнение 12.6. Планирование

Поскольку данная программа thread6.c очень похожа на программу предыдущего упражнения, мы рассмотрим только отличия.

1. Прежде всего, вам понадобится несколько дополнительных переменных:

int max_priority;

int min_priority;

struct sched_param scheduling_value;

2. После того как установлен атрибут отсоединения, вы задаете политику планирования:

res = pthread_attr_setschedpolicy(&amp;thread_attr, SCHED_OTHER);

if (res != 0) {

 perror(&quot;Setting scheduling policy failed&quot;);

 exit(EXIT_FAILURE);

}

3. Далее находите диапазон допустимых приоритетов

max_priority = sched_get_priority_max(SCHED_OTHER);

min_priority = sched_get_priority_min(SCHED_OTHER);

и задаете один из них:

scheduling_value.sched_priority = min_priority;

res = pthread_attr_setschedparam(&amp;thread_attr, &amp;scheduling_value);

if (res != 0) {

 perror(&quot;Setting scheduling priority failed&quot;);

Перейти на страницу:
Комментариев (0)
название