-->

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

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

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

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

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

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

<b>#include &lt;sys/types.h&gt;</b>

<b>#include &lt;sys/wait.h&gt;</b>

<b>pid_t wait(int *stat_loc);</b>

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

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

Интерпретировать информацию о состоянии процесса можно с помощью макросов, описанных в файле sys/wait.h и приведенных в табл. 11.2.

Таблица 11.2

Макрос Описание
WIFEXITED(stat_val)
Ненулевой, если дочерний процесс завершен нормально
WEXITSTATUS(stat_val)
Если
WIFEXITED
ненулевой, возвращает код завершения дочернего процесса
WIFSIGNALED(stat_val)
Ненулевой, если дочерний процесс завершается неперехватываемым сигналом
WTERMSIG(stat_val)
Если
WIFSIGNALED
ненулевой, возвращает номер сигнала
WIFSTOPPED(stat_val)
Ненулевой, если дочерний процесс остановился
WSTOPSIG(stat_val)
Если
WIFSTOPPED
ненулевой, возвращает номер сигнала

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

Упражнение 11.4. Системный вызов
wait

В этом упражнении вы слегка измените программу, чтобы можно было подождать и проверить код состояния дочернего процесса. Назовите новую программу wait.c.

#include &lt;sys/types.h&gt;

<i>#include &lt;sys/wait.h&gt;</i>

#include &lt;unistd.h&gt;

#include &lt;stdio.h&gt;

#include &lt;stdlib.h&gt;

int main() {

 pid_t pid;

 char* message;

 int n;

<i> int exit_code;</i>

 printf(&quot;fork program startingn&quot;);

 pid = fork();

 switch(pid) {

 case -1:

  perror(&quot;fork failed&quot;);

  exit(1);

 case 0:

  message = &quot;This is the child&quot;;

  n = 5;

<i>  exit_code = 37;</i>

  break;

 default:

  message = &quot;This is the parent&quot;;

  n = 3;

<i>  exit_code = 0;</i>

  break;

 }

 for (; n &gt; 0; n--) {

  puts(message);

  sleep(1);

 }

Следующий фрагмент программы ждет окончания дочернего процесса:

 if (pid != 0) {

  int stat_val;

  pid_t child_pid;

  child_pid = wait(&amp;stat_val);

  printf(&quot;Child has finished: PID = %dn&quot;, child_pid);

  if (WIFEXITED(stat_val))

   printf(&quot;Child exited with code %dn&quot;, WEXITSTATUS(stat_val));

  else printf(&quot;Child terminated abnormallyn&quot;);

 }

 exit(exit_code);

}

Когда вы выполните эту программу, то увидите, что родительский процесс ждет дочерний:

$ <b>./wait</b>

fork program starting

This is the child

This is the parent

This is the parent

This is the child

This is the parent

This is the child

This is the child

This is the child

Child has finished: PID = 1582

Child exited with code 37

$

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

Родительский процесс, получивший ненулевое значение, возвращенное из вызова

fork
, применяет системный вызов
wait
для приостановки своего выполнения до тех пор, пока информация о состоянии дочернего процесса не станет доступной. Это произойдет, когда дочерний процесс вызовет функцию
exit
; мы присвоили ему код завершения 37. Далее родительский процесс продолжается, определяет, протестировав значение, возвращенное вызовом
wait
, что дочерний процесс завершился нормально, и извлекает код завершения из информации о состоянии процесса.

Процессы-зомби

Применение вызова

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

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