Многозадачность в Linux. Язык программирования C. Статья 1 (функция exec)

30 October 2020
208 full reads
1 min.
375 story viewsUnique page visitors
208 read the story to the endThat's 55% of the total page views
1 minute — average reading time

Здесь весь мой канал Old Programmer. Здесь: Программирование. Тематическое оглавление моего Zen-канала (Old Programmer). А здесь собраны все ссылки, касающиеся языков C и C++. А здесь перечень ссылок на ресурсы, посвященные многозадачности.

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

О многозадачности в Linux

Когда говорим о многозадачности, то нельзя обойти два самых важных понятия: процесс и поток. В разных книжках есть определения этим понятиям. За основу можно взять определения из POSIX. Я же дам не строгие интуитивно-понятные определения. Для начала многозадачного программирования этого вполне достаточно.

И так процессом будем называть запущенный экземпляр программы. Поток - объект выполнения в рамках одного процесса. Как легко догадаться, при запуске процесса в нем всегда появляется как минимум один поток, который обычно называют главным (см. Рисунок 1). Но вы легко можете создавать несколько потоков в рамках одного процесса. Например: один поток управляет интерфейсом пользователя, другой отслеживает изменения в базе данных, третий параллельно анализирует данные и т.п. Мы займемся этим в следующих статьях.

Рисунок 1
Рисунок 1
Рисунок 1

Системные вызовы exec

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

В листинге multi1000.c приводится пример запуска программы (программа tree - вывода дерева каталогов). Системная функция execv содержит два параметра: полное имя программы (имя программы плюс полный путь к ней) и массив параметров. Важно иметь в виду, что сами параметры начинаются с индекса 1, последний элемент массив обязательно NULL. Элемент с индексом 0 - полный путь к программе, но, в принципе, может содержать и любую другую информацию. Функция printf() после execv() выполнится только в одном случае: если при выполнении execv() произошла ошибка. А это может произойти в основном по двум причинам: не правильно указано полное имя файла, отсутствие прав на запуск программы.

В данной статье я использовал функцию execv(). В действительности в языке C есть целое семейство функций exec(), отличающихся друг от друга разными входными параметрами и некоторыми особенностями запуска. Я не буду на этом останавливаться. Следующая статья по многозадачности здесь. А здесь можно найти список всех статей о многозадачности на моем канале.

Многозадачное программирование, это вам не на Бэйсике кодить. Подписываемся на мой канал Old Programmer.

Программа multi1000.c
Программа multi1000.c
Программа multi1000.c