Нейл Мэтью - Основы программирования в Linux

Тут можно читать онлайн Нейл Мэтью - Основы программирования в Linux - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-osnet, издательство «БХВ-Петербург», год 2009. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Основы программирования в Linux
  • Автор:
  • Жанр:
  • Издательство:
    «БХВ-Петербург»
  • Год:
    2009
  • Город:
    Санкт-Петербург
  • ISBN:
    978-5-9775-0289-4
  • Рейтинг:
    4/5. Голосов: 91
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

Нейл Мэтью - Основы программирования в Linux краткое содержание

Основы программирования в Linux - описание и краткое содержание, автор Нейл Мэтью, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

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

Для начинающих Linux-программистов

Основы программирования в Linux - читать онлайн бесплатно полную версию (весь текст целиком)

Основы программирования в Linux - читать книгу онлайн бесплатно, автор Нейл Мэтью
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

#include

#include

#include

#include

int main() {

pid_t pid;

char* message;

int n;

printf("fork program starting\n");

pid = fork();

switch(pid) {

case -1:

perror("fork failed");

exit(1);

case 0:

message = "This is the child";

n = 5;

break;

default:

message = "This is the parent";

n = 3;

break;

}

for (; n > 0; n--) {

puts(message);

sleep(1);

}

exit(0);

}

Эта программа выполняет два процесса. Дочерний процесс создается и выводит пять раз сообщение. Исходный процесс (родитель) выводит сообщение только три раза. Родительский процесс завершается до того, как дочерний процесс выведет все свои сообщения, поэтому в вывод попадает очередное приглашение командной оболочки.

$ ./fork1

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

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

Когда вызывается fork, эта программа делится на два отдельных процесса. Родительский процесс идентифицируется ненулевым возвращаемым из forkзначением и используется для задания количества сообщений, выводимых с интервалом в одну секунду.

Ожидание процесса

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

#include

#include

pid_t wait(int *stat_loc);

Системный вызов 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

#include

#include

#include

#include

int main() {

pid_t pid;

char* message;

int n;

int exit_code;

printf("fork program starting\n");

pid = fork();

switch(pid) {

case -1:

perror("fork failed");

exit(1);

case 0:

message = "This is the child";

n = 5;

exit_code = 37;

break;

default:

message = "This is the parent";

n = 3;

exit_code = 0;

break;

}

for (; n > 0; n--) {

puts(message);

sleep(1);

}

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

if (pid != 0) {

int stat_val;

pid_t child_pid;

child_pid = wait(&stat_val);

printf("Child has finished: PID = %d\n", child_pid);

if (WIFEXITED(stat_val))

printf("Child exited with code %d\n", WEXITSTATUS(stat_val));

else printf("Child terminated abnormally\n");

}

exit(exit_code);

}

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

$ ./wait

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. Он становится умершим или процессом-зомби.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Нейл Мэтью читать все книги автора по порядку

Нейл Мэтью - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




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


Отзывы читателей о книге Основы программирования в Linux, автор: Нейл Мэтью. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x