Linux программирование в примерах: Linux. Программирование в примерах | Роббинс Арнольд

Содержание

Книга «Linux: программирование в примерах» Роббинс А

Linux: программирование в примерах

В книге рассмотрены вопросы, связанные с програмированием под Linux: файловый ввод/вывод, метаданные файлов, основы управления памятью, процессы и сигналы, пользователи и группы, приёмы интернационализации и локализации, сортировка, поиск и многое другое. Большое внимание уделено средствам отладки, доступным под GNU Linux. Все темы иллюстрируются примерами кода, взятого из V7 UNIX и GNU. Эта книга может быть полезна любому, кто интересуется програмированием под Linux.

Поделись с друзьями:

Издательство:
Кудиц-Образ
Год издания:
2008
Место издания:
Москва
Язык текста:
русский
Язык оригинала:
английский
Перевод:
Галеев Р. Г.
Тип обложки:
Мягкая обложка
Формат:
70х90 1/16
Размеры в мм (ДхШхВ):
215×170
Вес:
780 гр.
Страниц:
656
Тираж:
1500 экз.
Код товара:
413774
Артикул:
50672
ISBN:
978-5-91136-056-6
В продаже с:
29.
05.2008
Аннотация к книге «Linux: программирование в примерах» Роббинс А.:
В книге рассмотрены вопросы, связанные с програмированием под Linux: файловый ввод/вывод, метаданные файлов, основы управления памятью, процессы и сигналы, пользователи и группы, приёмы интернационализации и локализации, сортировка, поиск и многое другое. Большое внимание уделено средствам отладки, доступным под GNU Linux. Все темы иллюстрируются примерами кода, взятого из V7 UNIX и GNU. Эта книга может быть полезна любому, кто интересуется програмированием под Linux.
Читать дальше…

1.

7. Резюме. Linux программирование в примерах

Читайте также

Резюме

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

Резюме

Резюме В этой главе были рассмотрены варианты конфигурации компоновочных блоков .NET, позволяющие совместное использование типов за рамками одного приложения. Вы увидели, что удаленный объект можно сконфигурировать, как MBV-или MBR-тип. Именно от этого, в конечном счете,

Резюме

Резюме Эта глава рассказывает об основах построения графического интерфейса с помощью типов, содержащихся в пространстве имен System.

Windows.Forms. Сначала вам предлагается создать несколько приложений вручную, и в процессе этого выясняется, что GUI-приложение, как минимум,

Резюме

Резюме Аббревиатура GDI+ используется для обозначения ряда связанных пространств имен .NET, используемых для визуализации графических образов на поверхности производных от Control типов. Значительная часть этой главы была посвящена выяснению того, как работать с базовыми

РЕЗЮМЕ

РЕЗЮМЕ Основной темой данной главы было обсуждение возможностей управления ходом выполнения программы. Язык Си предоставляет много средств для структурирования программ. С помощью операторов while и for реализуются циклы с предусловием. Второй оператор особенно подходит

РЕЗЮМЕ

РЕЗЮМЕ     Для создания больших программ вы должны использовать функции в качестве «строительных блоков». Каждая функция должна выполнять одну вполне определенную задачу. Используйте аргументы для передачи значений функции и ключевое слово return для передачи

Резюме

Резюме Итак, в этой главе вы познакомились с основами технологий оптических дисков и теперь, вооружившись знаниями, можете приступить к освоению самой программы Nero. По своей мощности и эффективности она не знает себе равных, но и требования, которые она предъявляет к

Резюме

Резюме В этой главе вы научились устанавливать пакет программ Nero 8 Premium Reloaded, познакомились со средствами запуска приложений пакета с помощью панели StartSmart, узнали, как работать со справочной системой приложений Nero 8 Premium. С помощью Start Smart пользователь пакета сможет

Резюме

Резюме В этой главе вы узнали, как создавать слайд-шоу. Для этого были использованы средства входящего в пакет Nero 8 приложения Nero Vision. Теперь вы знаете, как поместить фотографии в цифровой фотоальбом, сделать к ним звуковое сопровождение, создать красивое и понятное меню

Резюме

Резюме В этой главе вы узнали, что можно делать со звуковыми файлами при помощи встроенных в пакет Nero 8 приложений.Как записать файлы формата Audio CD на жесткий диск, как декодировать звуковые файлы в компактный MP3-формат, как с его помощью создать и сохранить на дисках свою

Резюме

Резюме Подведем краткий итог тому, что вы узнали из этой главы. Прежде всего, вы познакомились с новым приложением Nero Vision, входящим в состав пакета Nero 8. Вы научились создавать диски формата Video CD, используя два приложения – Nero Vision и Nero Burning ROM. Вы узнали, как выбрать

Резюме

Резюме Итак, подведем итог. Копирование дисков может осуществляться при помощи двух приводов, либо виртуального устройства. Копирование либо с помощью двух приводов осуществляется «на лету» с привода-источника на привод-приемник. А копирование посредством виртуального

Резюме

Резюме В этой главе мы рассмотрели две очень интересные программы пакета Nero 8 Premium – Nero Vision и Nero Recode, которые позволяют создавать DVD-Video либо из собственных видеоматериалов, либо из уже имеющихся дисков DVD-Video. Теперь вы знаете, как можно, пользуясь Nero Vision, получить

Резюме

Резюме Мы рассмотрели возможности пакета Nero 8 по архивированию и восстановлению данных средствами приложения Nero BackItUp. Теперь сохранение важной информации в виде резервных копий не будет представлять для вас трудностей. Воспользовавшись информацией из этой главы, вы

Резюме

Резюме В этой главе вы познакомились со вспомогательными инструментами пакета Nero 8. Теперь для вас не составит труда очистить перезаписываемый диск от ненужных записей, настроить скорость вращения диска в приводе. В этой главе мы также рассмотрели работу новых

Резюме

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

Изучите Linux прикладное программирование на примерах приложений



После изучения основ прикладного программирования Linux следующим шагом является изучение различных способов использования таких понятий программирования, как fork, потоки, механизм IPC и т. д.

Пожалуйста, руководство о том, как освоить эти концепции с помощью реальных приложений?

linux
Поделиться Источник nitin_cherian     22 ноября 2011 в 11:52

2 ответа


  • Монодевелоп для .NET приложения на Linux

    Мне нужно разработать C# приложений, но я использую Linux (ubuntu), я нашел MonoDevelop, но я не понимаю, могу ли я написать .NET приложений из Linux для использования на Windows, поэтому разработка на linux и выполнение на Windows. На сайте Mono я нашел: Mono-это программная платформа,…

  • Запуск Android приложений на платформе Linux

    Мы разрабатываем клиент-серверную систему для Android приложений, в которой сервер должен быть машиной Linux. Конечно, мы используем VMs, но это только так хорошо, как настоящее мобильное устройство. Поскольку мы рассматриваем возможность повышения скорости, мы хотели бы запустить эти приложения. ..



2

Не знаю, на что именно вы нацелены, но эта книга-классика, Если вы программируете на *nix:

Advanced Programming in the UNIX Environment (2nd Edition)
SBN-10:  0201433079
ISBN-13: 978-0201433074

HTH

Поделиться hochl     22 ноября 2011 в 11:59



1

Если вы хотите понять, что делает конкретная программа (например, обычная команда типа ls или date …) в терминах системных вызовов ), попробуйте использовать для нее strace , например

strace ls

Еще один важный момент заключается в том, что большая часть GNU/Linux является свободным программным обеспечением, поэтому вы можете изучить его исходный код (даже запустить его с помощью отладчика) и улучшить его.

Поделиться Basile Starynkevitch     22 ноября 2011 в 12:55


Похожие вопросы:


На каком языке написано большинство Linux GUI приложений?

Прошу прощения, если это не по теме. Пожалуйста, если это. Я хочу немного заняться разработкой приложений Linux. На каком языке программирования сделано большинство приложений GUI?


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

Я только что был втянут в Программирование Linux (Red Hat) после нескольких лет работы C++ на Win32. Поэтому я не ищу основы программирования. Скорее я стремлюсь быстро освоиться с вещами,…


Какой язык программирования используется для iPhone приложений?

Итак, в принципе, я хочу знать, какие языки программирования и в каком компиляторе я могу сделать iPhone приложения? В принципе, в настоящее время мои знания в области программирования таковы — PHP,…


Монодевелоп для . NET приложения на Linux

Мне нужно разработать C# приложений, но я использую Linux (ubuntu), я нашел MonoDevelop, но я не понимаю, могу ли я написать .NET приложений из Linux для использования на Windows, поэтому разработка…


Запуск Android приложений на платформе Linux

Мы разрабатываем клиент-серверную систему для Android приложений, в которой сервер должен быть машиной Linux. Конечно, мы используем VMs, но это только так хорошо, как настоящее мобильное…


Как определить язык программирования компилируемого приложения?

Я только что скачал приложение и хотел бы знать, на каком языке программирования оно написано. Если это Java, то должен быть процесс JVM, работающий в фоновом режиме, верно? Я сделал: % sudo ps -A |…


Android Разработка Приложений

Я программист PHP. Теперь я планирую изучить разработку приложений Android. Я проверил, используя много языков программирования, таких как Java, c#, Python и т. д. мы можем разрабатывать приложения…


Приложение Приложение-служба Azure ‘веб-приложение на Linux’ ведение журнала

В настоящее время я использую Azure ‘Web app on Linux’, который использует docker контейнеров для размещения java приложений и python приложений через частный реестр(Azure Container Registry), и мне…


Время выполнения для .NET основных приложений на linux

Я немного запутался с .NET основными приложениями, работающими на linux. Чтобы .NET основных приложений работали на linux, должны ли мы установить .NET основных приложений на linux ? .NET основные…


Хостинг angular приложения в azure linux сервисе приложений

Я использую фреймворк angular для создания интерфейсных приложений. Есть ли какой-нибудь способ, как я могу развернуть приложения в службе приложений Azure Linux? Я создал веб-приложение с NodeJS…

Программирование в Linux для чайников

В Linux есть превосходная среда разработки прикладных программ Gambas.  

Немного о среде программирования Gambas. Язык и среда программирования созданы молодым французом Benoit Minisini из предместий Парижа для собственного удовольствия, которое он получает как от создания компиляторов, так и от игры на флейте, и от обучения актерскому мастерству, и от работы в качестве профессионального программиста.

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

 

Пункт меню File, который обычно служит для работы с файлами, в данном случае служит для работы с файлами проекта: New project. .. (создание нового проекта), Open project… (открыть проект), Open recent (открыть недавний проект), Open example (открыть пример), Save project (сохранить проект), Quit (и выйти).

Для работы над проектом, служит раздел Project:

 

Это, соответственно, компиляция файла, компиляция проекта, создание исполняемого файла, создание архива исходного текста, создание установочного пакета, свойства проекта, очистка и обновление проекта.

Два пункта меню могут быть непривычны для пользователей Windows – создание архива исходных текстов и установочного пакета. Но не следует забывать, что и программы, и сама операционная система Linux всегда существуют в виде открытых исходных кодов. В Linux можно установить программу двумя способами, либо используя исходный код и средства операционной системы для компиляции и установки программы, либо используя готовый установочный пакет, подобный Setup в Windows. Правда, в разных дистрибутивах Linux такой установочный пакет может быть разным, и не всегда его можно установить, дважды щелкнув мышкой по установочному пакету. 

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

Далее следуют разделы вида — View (открывающий и закрывающие все окна диалога рабочей области), инструментов (Tools) и подсказок (?). В последнем разделе достаточно подробный Help browser, основанный на Wiki в последней версии программы.

Основная инструментальная панель, как это принято, повторяет наиболее часто используемые разделы основного меню, имеет всплывающие подсказки назначения клавиш.

Графическая работа над формой проекта и кодом программы может вестись быстрым переключением с помощью ярлычков, на рисунке ниже Fmain. form и Fmain.class, щелкая мышкой по которым попадаешь в графический редактор или редактор кода. Каждый из них имеет свое основное инструментальное меню. На рисунке ниже – инструментальное меню графического редактора.

 

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

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

Запускаем Gambas, который находится в разделе Программирование основного меню Приложения:

 

 

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

Чтобы создать новый проект выбираем New project.

 

Открывается диалог, в котором можно ввести название проекта, его заголовок, указать место, где проект будет располагаться. Gambas хранит все, что относится к проекту, в заданной директории, которая будет носить имя проекта. Для перемещения по диалогу достаточно нажимать клавишу Next, но в самом начале следует выбрать, какого рода проект вы намерены создать. На выбор три варианта – графический проект, терминальный проект, использование копии существующего (вашего или нет) проекта 

Выбираем, к примеру, графический проект.

Выбрав графический проект, дав ему имя и место жительства, мы попадаем в среду программирования, которая позволит сделать первый шаг – создать форму. Для этого в правом окне менеджера проекта, где отображается «дерево» проекта, щелкаем правой клавишей мышки по разделу Forms, а в выпадающем меню выбираем раздел New, что приводит к меню выбора, в котором есть пункт Form ( создать новую форму). Форма является основным окном программы, которое появится, когда форму заполнить некоторым содержанием, и построить проект. В окне диалога создания формы можно задать имя формы, что важно для средних и больших проектов, содержащих много окон, можно установить ряд опций.

 

Щелкнув по клавише OK, появляется форма и редактор программы. На форме, видимо, можно будет разместить разные кнопочки, окошки и другие  средства программы. А в редакторе поместится все то, что и будет кодом программы.  

 

Форма, как и многие элементы управления, имеет свойство Text, это текст, который появится вместо надписи Form1. Form при выполнении программы. Если щелкнуть по форме правой клавишей мышки, в выпадающем меню появится пункт Code, который вызывает редактор кода. 

Отдельную область занимает инструментарий проекта – Toolbox. Построенный аналогично рабочей области, он тоже имеет различные ярлычки, открывающие страницы, на которых размещаются средства создания проекта. 

Окно списка доступных компонентов Gambas

 

Программа интуитивно понятна и очень удобна, к тому же, благодаря всплавающим подсказкам, сама помогает писать вам программный код.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Поделиться:

 

 

Оставьте свой комментарий!

Добавить комментарий

< Предыдущая   Следующая >

6 лучших книг о Linux для глубокого понимания системы

Подборка из 6 лучших книг о Linux, которые подойдут и новичку, и опытному линуксоиду, чтобы понять ядро и процесс разработки под Linux.

Наша подборка книг о Linux

Книга, рассказывающая о низкоуровневом функционале Linux, тонкостях работы с системой и системном администрировании в целом. Автор расскажет про устройство ядра Linux, затронет особенности написания системных сценариев на C и вопросы защиты информации, поделится опытом правильного эксплуатирования компьютерных сетей.

В семействе Linux существует множество дистрибутивов, каждый из которых чем-то выделяется. Автор постарался рассказать о Linux-системах без привязки к конкретному дистрибутиву. В этой книге речь пойдет о проектах Gnome и KDE, виртуализации, устройстве файловой системы, ядре и его модулях, и еще о множестве вещей, связанных с Linux.

Автор рассказывает об основах работы в командной строке Linux и о тонкой настройке системы с помощью утилит, не имеющих графического интерфейса. Подробно разбираются команды Linux, основы файловой системы, рассматривается работа загрузчиков GRUB и GRUB2.

Роберт Лав – автор книг о Linux, одна из ключевых фигур, участвовавших в разработке ядра Linux и среды Gnome. Эта книга может стать настольной для системных программистов: она рассказывает как писать быстрый и умный код, и содержит справочную информацию о системных вызовах. Книга содержит не только теорию, но и практические материалы.

Эта книга поможет понять ядро Linux настолько, насколько это возможно. Автор детально рассказывает обо всех подсистемах ядра, о процессе их проектирования и реализации. Несмотря на низкоуровневость темы, книга подойдет как начинающим, так и опытным системным программистам.

Для уверенной работы с Unix-системами, будь то семейство Linux или даже MacOS, необходимо уметь работать с Bash. Автор рассматривает как вопросы синтаксиса языка, так и ограничения оболочки, и сопроцессоры.

Примеры программирования на C для Linux для начинающих

Язык программирования C является одним из хороших вариантов обучения программированию для начинающих. Базовая логика программирования может быть легко изучена с использованием языка C в качестве первого языка. Некоторые считают Java первым языком программирования, но я думаю, что лучше изучить структурированное или процедурное программирование с использованием языка Си, прежде чем изучать любое объектно-ориентированное программирование. Базовое C-программирование на Linux показано в этой статье на разных примерах для начинающих.

предпосылками

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

Пример 1: написать и запустить вашу первую программу на C

Напишите следующий код в любом текстовом редакторе и сохраните файл с расширением «.c». Заголовочный файл stdio.h содержит все необходимые функции для стандартного ввода и вывода. Любой исходный код программы на C начинает компиляцию из метода main () . Функция printf () используется здесь для печати вывода в терминале.

#include
int main()
{
  printf(«Learning C»);
}

Запустите следующую команду, чтобы скомпилировать и выполнить код. Имя исходного файла — first.c, а имя исполняемого файла — first_program .

$ gcc first.c -o first_prpgram
$ ./first_program

Пример 2: чтение ввода пользователя

Функция scanf () используется в C для чтения ввода от пользователя, который находится в stdio.h. Язык C является строго типизированным языком и поддерживает разные типы данных. Integer и тип данных char используются в этом примере. Массив из 100 символов объявляется переменной name, а целое число — переменной age . После получения двух вводных данных отформатированные значения будут напечатаны функцией prinf () .

#include
int main()
{
  char name[100];
  int age;
  printf(«Enter your name: «);
  scanf(«%s»,name);
  printf(«Enter your age: «);
  scanf(«%d»,&age);
  printf(«Hello, %s,You are %d years old», name, age);
}

Пример 3: чтение аргументов командной строки

Переменные argc и argv используются в качестве параметров в методе main () для чтения значений аргументов командной строки. argc используется для чтения общего количества аргументов, а argv используется для чтения значений аргументов в виде массива. Как напечатать общее количество аргументов командной строки и первые три значения аргумента показано в этом примере.

#include
int main(int argc,char* argv[]){
  printf(«Total number of arguments = %d\n»,argc);
  printf(«Argument No. 1 = %s\n»,argv[0]);
  printf(«Argument No. 2 = %s\n»,argv[1]);
  printf(«Argument No. 3 = %s\n»,argv[2]);
}

Пример 4: Сравнить строку с помощью условных операторов

Функция strcmp () используется в языке Си для сравнения двух строк. Если две строки равны, возвращается 0 . Если первая строка больше, чем вторая строка, она возвращает 1 . Если первая строка меньше, чем вторая строка, она возвращает -1 . В этом примере два числовых значения и строковое значение будут приняты как входные данные от пользователя. Если строковое значение равно add, то оно выведет сумму двух чисел. Если строковое значение — sub, то оно выведет вычитание двух чисел. Если оба условия возвращают значение false, выводится 0 .

#include
#include
int main(){
  int n1, n2, result;
  char operator[10];
  printf(«Enter first number :»);
  scanf(«%d»,&n1);
  printf(«Enter second number :»);
  scanf(«%d»,&n2);
  printf(«Enter operation name :»);
  scanf(«%s»,operator);
  if(strcmp(operator,»add») == 0)
    result = n1 + n2;
  else if(strcmp(operator,»sub») == 0)
    result = n1 — n2;
  else
    result=0;
  printf(«The result is : %d\n»,result);
}

Пример 5: итерация списка строк с использованием цикла for

Переменная массива объявляется с помощью [] в программе на Си. В этом примере объявлен список двумерного массива символов, который содержит 5 строковых значений. Функция sizeof () используется для подсчета общего количества элементов любого массива в C. Цикл for используется в этом примере для итерации массива flowers и печати значения каждого элемента массива flowers.

#include
int main()
{
  char flowers[10][20] = {«Rose», «Poppy», «Lily», «Tulip», «Marigold»};
  int total=sizeof(flowers)/sizeof(flowers[0]);
  for (int n = 0; n total; n++)
  {
    printf(«%s\n»,flowers[n]);
  }
}

Пример 6: Найти четные числа из списка, используя цикл while

В этом примере объявлен одномерный массив из 10 целых чисел. Цикл while на языке Си показан здесь. Следующий код найдет все четные числа из числового массива. Если числа, которые делятся на 2, являются четными числами. в то время как цикл используется здесь , чтобы прочитать каждый элемент массива и проверить значение остатка от деления элемента на 2. Когда значение остального возвращает 0 для любого элемента , то он будет напечатан.

#include
int main(){
  int numbers[10] = { 21, 78, 62, 90, 55, 10, 85, 45 };
  int i = 0;
  printf(«The even numbers from the list are:\n»);
  while(i 10)  {
    if((numbers[i] % 2) == 0)
      printf(«%d\n», numbers[i]);
    i++;
  }
}

Пример-7: узнать площадь прямоугольника с помощью функции

Каждая функция в C содержит тип возвращаемого значения, имя функции и параметры. Функция без параметров также может быть объявлена ​​в C. Если в исходном коде объявлена ​​любая функция без функции main (), то прототип этой функции должен быть объявлен до объявления функции. В этом примере функция area () объявляется для вычисления площади любого прямоугольника, который содержит два параметра, чтобы получить значения высоты и ширины прямоугольника. Функция main () будет считывать значение высоты и ширины от пользователя и вызывать функцию area () для вычисления и печати области. Прототип функции area () объявляется в начале кода.

#include
int area(int h, int w);
int area(int h, int w)
{
  int area = h * w;
  return area;
}

int main()
{
  int height, width;
  printf(«Enter the height of the rectangle:»);
  scanf(«%d», &height);
  printf(«Enter the width of the rectangle:»);
  scanf(«%d», &width);
 
  printf(«The area of the rectangle = %d\n»,area(height,width));
}

Попробуй себя:

  • Напишите программу на C, в которой число будет считаться возрастным значением человека, и напечатайте, является ли он подростком, молодым или старым.
  • Напишите программу на C, чтобы найти определенную строку в списке.
  • Напишите программу на C, используя функцию для расчета площади трапеции.

Вывод:

Самые основные части программирования описаны здесь на простых примерах, чтобы начать программирование на языке Си. Объявления различных переменных, условных операторов, цикла и функции в C показаны в этой статье.

Файл дескриптор в Linux с примерами / Хабр

Однажды, на одном интервью меня спросили, что ты будешь делать, если обнаружишь неработающий сервис из-за того, что на диске закончилось место?

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

На это я сказал, что всегда можно посмотреть открытые файл дескрипторы, например командой lsof и понять какое приложение заняло все доступное место, а дальше можно действовать по обстоятельствам, в зависимости от того, нужны ли данные.

Интервьюер прервал меня на последнем слове, дополнив свой вопрос: «Предположим, что данные нам не нужны, это просто дебаг лог, но приложение не работает из-за того, что не может записать дебаг»?

«окей», — ответил я, «мы можем выключить дебаг в конфиге приложения и перезапустить его».
Интервьюер возразил: «Нет, приложение мы перезапустить не можем, у нас в памяти все еще хранятся важные данные, а к самому сервису подключены важные клиенты, которых мы не можем заставлять переподключаться заново».

«ну хорошо», сказал я, «если мы не можем перезапускать приложение и данные нам не важны, то мы можем просто очистить этот открытый файл через файл дескриптор, даже если мы его не видим в команде ls на файловой системе».

Интервьюер остался доволен, а я нет.

Тогда я подумал, почему человек, проверяющий мои знания, не копает глубже? А что, если данные все-таки важны? Что если мы не можем перезапускать процесс, и при этом этот процесс пишет на файловую систему в раздел, на котором нет свободного места? Что если мы не можем потерять не только уже записанные данные, но и те данные, что этот процесс пишет или пытается записать?

Тузик


В начале моей карьеры я пытался создать небольшое приложение, в котором нужно было хранить информацию о пользователях. И тогда я думал, а как мне сопоставить пользователя к его данным. Есть, например, у меня Иванов Иван Иваныч, и есть у него какие-то данные, но как их подружить? Я могу указать напрямую, что собака по имени «Тузик» принадлежит этому самому Ивану. Но что, если он сменит имя и вместо Ивана станет, например, Олей? Тогда получится, что наша Оля Ивановна Иванова больше не будет иметь собаки, а наш Тузик все еще будет принадлежать несуществующему Ивану. Решить эту проблему помогла база данных, которая каждому пользователю давала уникальный идентификатор (ID), и мой Тузик привязывался к этому ID, который, по сути, был просто порядковым номером. Таким образом хозяин у тузика был с ID под номером 2, и на какой-то момент времени под этим ID был Иван, а потом под этим же ID стала Оля. Проблема человечества и животноводства была практически решена.

Файл дескриптор


Проблема файла и программы, работающей с этим файлом, примерно такая же как нашей собаки и человека. Предположим я открыл файл под именем ivan. txt и начал в него записывать слово tuzik, но успел записать только первую букву «t» в файл, и этот файл был кем-то переименован, например в olya.txt. Но файл остался тем же самым, и я все еще хочу записать в него своего тузика. Каждый раз при открытии файла системным вызовом open в любом языке программирования я получаю уникальный ID, который указывает мне на файл, этот ID и есть файл дескриптор. И совершенно не важно, что и кто делает с этим файлом дальше, его могут удалить, его могут переименовать, ему могут поменять владельца или забрать права на чтение и запись, я все равно буду иметь к нему доступ, потому что на момент открытия файла у меня были права для его чтения и/или записи и я успел начать с ним работать, а значит должен продолжать это делать.

В Linux библиотека libc открывает для каждого запущенного приложения(процесса) 3 файл дескриптора, с номерами 0,1,2. Больше информации вы можете найти по ссылкам man stdio и man stdout

  • Файл дескриптор 0 называется STDIN и ассоциируется с вводом данных у приложения
  • Файл дескриптор 1 называется STDOUT и используется приложениями для вывода данных, например командами print
  • Файл дескриптор 2 называется STDERR и используется приложениями для вывода данных, сообщающих об ошибке

Если в вашей программе вы откроете какой-либо файл на чтение или запись, то скорее всего вы получите первый свободный ID и это будет номер 3.

Список файл дескрипторов можно посмотреть у любого процесса, если вы знаете его PID.

Например, откроем консоль с bash и посмотрим PID нашего процесса

[[email protected] ]$ echo $$
15771

Во второй консоли запустим
[[email protected] ]$ ls -lah /proc/15771/fd/
total 0
dr-x------ 2 user user  0 Oct  7 15:42 .
dr-xr-xr-x 9 user user  0 Oct  7 15:42 ..
lrwx------ 1 user user 64 Oct  7 15:42 0 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 2 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 255 -> /dev/pts/21

Файл дескриптор с номером 255 можете смело игнорировать в рамках данной статьи, он был открыт для своих нужд уже самим bash, а не прилинкованной библиотекой.

Сейчас все 3 файл дескриптора связаны с устройством псевдотерминала /dev/pts, но мы все равно можем ими манипулировать, например запустим во второй консоли

[[email protected] ]$ echo "hello world" > /proc/15771/fd/0

И в первой консоли мы увидим
[[email protected] ]$ hello world

Redirect и Pipe


Вы можете легко переопределить эти 3 файл дескриптора в любом процессе, в том числе и в bash, например через трубу(pipe), соединяющую два процесса, смотрим
[[email protected] ]$ cat /dev/zero | sleep 10000

Вы можете сами запустить эту команду с strace -f и увидеть, что происходит внутри, но я вкратце расскажу.

Наш родительский процесс bash с PID 15771 парсит нашу команду и понимает сколько именно команд мы хотим запустить, в нашем случае их две: cat и sleep. Bash знает что ему нужно создать два дочерних процесса, и объединить их одной трубой. Итого bash потребуется 2 дочерних процесса и один pipe.

Перед созданием дочерних процессов bash запускает системный вызов pipe и получает новые файл дескрипторы на временный буфер pipe, но этот буфер никак пока не связывает наши два дочерних процесса.

Для родительского процесса это выглядит так будто pipe уже есть, а дочерних процессов еще нет:

PID    command
15771  bash
lrwx------ 1 user user 64 Oct  7 15:42 0 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 2 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 3 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:42 4 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:42 255 -> /dev/pts/21

Затем с помощью системного вызова clone bash создает два дочерних процесса, и наши три процесса будут выглядеть так:
PID    command
15771  bash
lrwx------ 1 user user 64 Oct  7 15:42 0 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 2 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 3 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:42 4 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:42 255 -> /dev/pts/21
PID    command
9004  bash
lrwx------ 1 user user 64 Oct  7 15:57 0 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:57 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:57 2 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:57 3 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:57 4 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:57 255 -> /dev/pts/21
PID    command
9005  bash
lrwx------ 1 user user 64 Oct  7 15:57 0 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:57 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:57 2 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:57 3 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:57 4 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:57 255 -> /dev/pts/21

Не забываем, что clone клонирует процесс вместе со всеми файл дескрипторами, поэтому в родительском процессе и в дочерних они будут одинаковые. Задача родительского процесса с PID 15771 следить за дочерними процессами, поэтому он просто ждет ответ от дочерних.

Следовательно pipe ему не нужен, и он закрывает файл дескрипторы с номерами 3 и 4.

В первом дочернем процессе bash с PID 9004, системным вызовом dup2, меняет наш STDOUT файл дескриптор с номером 1 на файл дескриптор указывающий на pipe, в нашем случае это номер 3. Таким образом все, что первый дочерний процесс с PID 9004 будет писать в STDOUT, будет автоматически попадать в буфер pipe.

Во втором дочернем процессе с PID 9005 bash меняет с помощью dup2 файл дескриптор STDIN с номером 0. Теперь все, что будет читать наш второй bash с PID 9005, будет читать из pipe.

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

Файл дескриптор 255 я намеренно игнорирую, он использует для внутренних нужд самого bash и в дочерних процессах будет также закрыт.

Далее в первом дочернем процессе с PID 9004 bash запускает с помощью системного вызова exec исполняемый файл, который мы указали в командной строке, в нашем случае это /usr/bin/cat.

Во втором дочернем процессе с PID 9005 bash запускает второй исполняемый файл, который мы указали, в нашем случае это /usr/bin/sleep.

Системный вызов exec не закрывает файл дескрипторы, если они не были открыты с флагом O_CLOEXEC во время выполнения вызова open. В нашем случае после запуска исполняемых файлов все текущие файл дескрипторы сохранятся.

Проверяем в консоли:

[[email protected] ]$ pgrep -P 15771
9004
9005
[[email protected] ]$ ls -lah /proc/15771/fd/
total 0
dr-x------ 2 user user  0 Oct  7 15:42 .
dr-xr-xr-x 9 user user  0 Oct  7 15:42 ..
lrwx------ 1 user user 64 Oct  7 15:42 0 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 2 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 255 -> /dev/pts/21
[[email protected] ]$ ls -lah /proc/9004/fd
total 0
dr-x------ 2 user user  0 Oct  7 15:57 .
dr-xr-xr-x 9 user user  0 Oct  7 15:57 ..
lrwx------ 1 user user 64 Oct  7 15:57 0 -> /dev/pts/21
l-wx------ 1 user user 64 Oct  7 15:57 1 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:57 2 -> /dev/pts/21
lr-x------ 1 user user 64 Oct  7 15:57 3 -> /dev/zero
[[email protected] ]$ ls -lah /proc/9005/fd
total 0
dr-x------ 2 user user  0 Oct  7 15:57 . 
dr-xr-xr-x 9 user user  0 Oct  7 15:57 ..
lr-x------ 1 user user 64 Oct  7 15:57 0 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:57 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:57 2 -> /dev/pts/21
[[email protected] ]$ ps -up 9004
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
user  9004  0.0  0.0 107972   620 pts/21   S+   15:57   0:00 cat /dev/zero
[[email protected] ]$ ps -up 9005
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
user  9005  0.0  0.0 107952   360 pts/21   S+   15:57   0:00 sleep 10000

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

Для тех, кто не знаком с системными вызовами, которые использует bash, крайне рекомендую запустить команды через strace и посмотреть, что происходит внутри, например, так:

strace -s 1024 -f bash -c "ls | grep hello"

Вернемся к нашей проблеме с нехваткой места на диске и попыткой сохранить данные без перезапуска процесса. Напишем небольшую программу, которая будет записывать на диск примерно 1 мегабайт в секунду. При этом если по какой-либо причине мы не смогли записать данные на диск, мы будем просто игнорировать это и пытаться записать данные вновь через секунду. В примере я использую Python, вы можете использовать любой другой язык программирования.
[[email protected] ]$ cat openforwrite.py 
import datetime
import time

mystr="a"*1024*1024+"\n"
with open("123.txt", "w") as f:
    while True:
        try:
            f.write(str(datetime.datetime.now()))
            f.write(mystr)
            f.flush()
            time.sleep(1)
        except:
            pass

Запустим программу и посмотрим на файл дескрипторы
[[email protected] ]$ python openforwrite.py &
[1] 3762
[[email protected] ]$ ps axuf | grep [o]penforwrite
user  3762  0.0  0.0 128600  5744 pts/22   S+   16:28   0:00  |   \_ python openforwrite.py
[[email protected] ]$ ls -la /proc/3762/fd
total 0
dr-x------ 2 user user  0 Oct  7 16:29 . 
dr-xr-xr-x 9 user user  0 Oct  7 16:29 ..
lrwx------ 1 user user 64 Oct  7 16:29 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  7 16:29 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  7 16:29 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  7 16:29 3 -> /home/user/123.txt

Как видим у нас есть наши 3 стандартные файл дескрипторы и еще один, который мы открыли. Проверим размер файла:
[[email protected] ]$ ls -lah 123.txt 
-rw-rw-r-- 1 user user 117M Oct  7 16:30 123.txt

данные пишутся, пробуем поменять права на файл:
[[email protected] ]$ sudo chown root: 123.txt
[[email protected] ]$ ls -lah 123.txt 
-rw-rw-r-- 1 root root 168M Oct  7 16:31 123.txt
[[email protected] ]$ ls -lah 123.txt 
-rw-rw-r-- 1 root root 172M Oct  7 16:31 123.txt

Видим, что данные все еще пишутся, хотя наш пользователь не имеет права писать в файл. Попробуем его удалить:
[[email protected] ]$ sudo rm 123.txt 
[[email protected] ]$ ls 123. txt
ls: cannot access 123.txt: No such file or directory

Куда пишутся данные? И пишутся ли вообще? Проверяем:
[[email protected] ]$ ls -la /proc/3762/fd
total 0
dr-x------ 2 user user  0 Oct  7 16:29 .
dr-xr-xr-x 9 user user  0 Oct  7 16:29 ..
lrwx------ 1 user user 64 Oct  7 16:29 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  7 16:29 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  7 16:29 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  7 16:29 3 -> /home/user/123.txt (deleted)

Да, наш файл дескриптор все еще существует, и мы можем работать с этим файл дескриптором как с нашим старым файлом, мы можем его читать, очищать и копировать.

Смотрим на размер файла:

[[email protected] ]$ lsof | grep 123.txt
python    31083             user    3w      REG                8,5   19923457   2621522 /home/user/123.txt

Размер файла 19923457. Пробуем очистить файл:
[[email protected] ]$ truncate -s 0 /proc/31083/fd/3
[[email protected] ]$ lsof | grep 123. txt
python    31083             user    3w      REG                8,5  136318390   2621522 /home/user/123.txt

Как видим размер файла только увеличивается и наш транкейт не сработал. Обратимся к документации по системному вызову open. Если при открытии файла мы используем флаг O_APPEND, то при каждой записи операционная система проверяет размер файла и пишет данные в самый конец файла, причем делает это атомарно. Это позволяет нескольким тредам или процессам писать в один и тот же файл. Но в нашем коде мы не используем этот флаг. Мы можем увидеть другой размер файла в lsof после транкейт только если откроем файл для дозаписи, а значит в нашем коде вместо
with open("123.txt", "w") as f:

мы должны поставить
with open("123.txt", "a") as f:

Проверяем с «w» флагом
[[email protected] ]$ strace -e trace=open python openforwrite.py 2>&1| grep 123.txt
open("123.txt", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3

и с «a» флагом
[[email protected] ]$ strace -e trace=open python openforwrite. py 2>&1| grep 123.txt
open("123.txt", O_WRONLY|O_CREAT|O_APPEND, 0666) = 3

Программируем уже запущенный процесс


Часто программисты при создании и тестировании программы используют дебагеры (например GDB) или различные уровни логирования в приложении. Linux предоставляет возможность фактически писать и менять уже запущенную программу, например менять значения переменных, устанавливать breakpoint и тд и тп.

Возвращаясь к оригинальному вопросу с нехваткой места на диске для записи файла, попробуем сэмулировать проблему.

Создадим файл для нашего раздела, который мы подмонтируем как отдельный диск:

[[email protected] ~]$ dd if=/dev/zero of=~/tempfile_for_article.dd bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.00525929 s, 2.0 GB/s
[[email protected] ~]$

Создадим файловую систему:
[[email protected] ~]$ mkfs.ext4 ~/tempfile_for_article.dd
mke2fs 1.42.9 (28-Dec-2013)
/home/user/tempfile_for_article. dd is not a block special device.
Proceed anyway? (y,n) y
...
Writing superblocks and filesystem accounting information: done
[[email protected] ~]$

Подмонтируем файловую систему:
[[email protected] ~]$ sudo mount ~/tempfile_for_article.dd /mnt/
[sudo] password for user: 
[[email protected] ~]$ df -h | grep mnt
/dev/loop0      8.7M  172K  7.9M   3% /mnt

Создаем директорию с нашим владельцем:
[[email protected] ~]$ sudo mkdir /mnt/logs
[[email protected] ~]$ sudo chown user: /mnt/logs

Откроем файл только на запись в нашей программе:
with open("/mnt/logs/123.txt", "w") as f:

Запускаем
[[email protected] ]$ python openforwrite.py 

Ждем несколько секунд
[[email protected] ~]$ df -h | grep mnt
/dev/loop0      8.7M  8.0M     0 100% /mnt

Итак, мы получили проблему, описанную в начале этой статьи. Свободного места 0, занятого 100%.

Мы помним, что по условиям задачи мы пытаемся записать очень важные данные, которые нельзя потерять. И при этом нам нужно починить сервис без перезапуска процесса.

Допустим, у нас все же есть место на диске, но в другом разделе, например в /home.

Попробуем «перепрограммировать на лету» наш код.

Смотрим PID нашего процесса, который съел все место на диске:

[[email protected] ~]$ ps axuf | grep [o]penfor
user 10078 27.2  0.0 128600  5744 pts/22   R+   11:06   0:02  |   \_ python openforwrite.py

Подключаемся к процессу через gdb
[[email protected] ~]$ gdb -p 10078
...
(gdb) 

Смотрим открытые файл дескрипторы:
(gdb) shell ls -lah /proc/10078/fd/
total 0
dr-x------ 2 user user  0 Oct  8 11:06 .
dr-xr-xr-x 9 user user  0 Oct  8 11:06 ..
lrwx------ 1 user user 64 Oct  8 11:09 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:09 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:06 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  8 11:09 3 -> /mnt/logs/123.txt

Смотрим информацию о файл дескрипторе с номером 3, который нас интересует
(gdb) shell cat /proc/10078/fdinfo/3
pos:    8189952
flags:  0100001
mnt_id: 482

Помня о том, какой системный вызов делает Python (смотрите выше, где мы запускали strace и находили вызов open), обрабатывая наш код для открытия файла, мы делаем то же самое самостоятельно от имени нашего процесса, но биты O_WRONLY|O_CREAT|O_TRUNC нам нужно заменить на числовое значение. Для этого открываем исходники ядра, например тут и смотрим какие флаги за что отвечают

#define O_WRONLY 00000001
#define O_CREAT 00000100
#define O_TRUNC 00001000

Объединяем все значения в одно, получаем 00001101

Запускаем наш вызов из gdb

(gdb) call open("/home/user/123.txt", 00001101,0666)
$1 = 4

Итак мы получили новый файл дескриптор с номером 4 и новый открытый файл на другом разделе, проверяем:
(gdb) shell ls -lah /proc/10078/fd/
total 0
dr-x------ 2 user user  0 Oct  8 11:06 .
dr-xr-xr-x 9 user user  0 Oct  8 11:06 ..
lrwx------ 1 user user 64 Oct  8 11:09 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:09 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:06 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  8 11:09 3 -> /mnt/logs/123.txt
l-wx------ 1 user user 64 Oct  8 11:15 4 -> /home/user/123.txt

Мы помним пример с pipe — как bash меняет файл дескрипторы, и уже выучили системный вызов dup2.

Пробуем подменить один файл дескриптор другим

(gdb) call dup2(4,3)
$2 = 3

Проверяем:
(gdb) shell ls -lah /proc/10078/fd/
total 0
dr-x------ 2 user user  0 Oct  8 11:06 .
dr-xr-xr-x 9 user user  0 Oct  8 11:06 ..
lrwx------ 1 user user 64 Oct  8 11:09 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:09 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:06 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  8 11:09 3 -> /home/user/123.txt
l-wx------ 1 user user 64 Oct  8 11:15 4 -> /home/user/123.txt

Закрываем файл дескриптор 4, так как нам он не нужен:
(gdb) call close (4)
$1 = 0

И выходим из gdb
(gdb) quit
A debugging session is active.

    Inferior 1 [process 10078] will be detached.

Quit anyway? (y or n) y
Detaching from program: /usr/bin/python2.7, process 10078

Проверяем новый файл:
[[email protected] ~]$ ls -lah /home/user/123.txt
-rw-rw-r-- 1 user user 5. 1M Oct  8 11:18 /home/user/123.txt
[[email protected] ~]$ ls -lah /home/user/123.txt
-rw-rw-r-- 1 user user 7.1M Oct  8 11:18 /home/user/123.txt

Как видим, данные пишутся в новый файл, проверяем старый:
[[email protected] ~]$ ls -lah /mnt/logs/123.txt 
-rw-rw-r-- 1 user user 7.9M Oct  8 11:08 /mnt/logs/123.txt

Данные не потеряны, приложение работает, логи пишутся в новое место.

Немного усложним задачу


Представим, что данные нам важны, но места на диске у нас нет ни в одном из разделов и подключить диск мы не можем.

Что мы можем сделать, так это перенаправить куда-то наши данные, например в pipe, а данные из pipe в свою очередь перенаправить в сеть через какую-либо программу, например netcat.
Мы можем создать именованный pipe командой mkfifo. Она создаст псевдофайл на файловой системе, даже если на ней нет свободного места.

Перезапускаем приложение, и проверяем:

[[email protected] ]$ python openforwrite. py 
[[email protected] ~]$ ps axuf | grep [o]pen
user  5946 72.9  0.0 128600  5744 pts/22   R+   11:27   0:20  |   \_ python openforwrite.py
[[email protected] ~]$ ls -lah /proc/5946/fd
total 0
dr-x------ 2 user user  0 Oct  8 11:27 .
dr-xr-xr-x 9 user user  0 Oct  8 11:27 ..
lrwx------ 1 user user 64 Oct  8 11:28 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:28 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:27 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  8 11:28 3 -> /mnt/logs/123.txt
[[email protected] ~]$ df -h | grep mnt
/dev/loop0      8.7M  8.0M     0 100% /mnt

Места на диске нет, но мы успешно создаем там именованный pipe:
[[email protected] ~]$ mkfifo /mnt/logs/megapipe
[[email protected] ~]$ ls -lah /mnt/logs/megapipe 
prw-rw-r-- 1 user user 0 Oct  8 11:28 /mnt/logs/megapipe

Теперь нам надо как-то завернуть все данные, что попадают в этот pipe на другой сервер через сеть, для этого подойдет все тот же netcat.

На сервере remote-server. example.com запускаем

[[email protected] ~]$ nc -l 7777 > 123.txt 

На нашем проблемном сервере запускаем в отдельном терминале
[[email protected] ~]$ nc remote-server.example.com 7777 < /mnt/logs/megapipe 

Теперь все данные, которые попадут в pipe автоматически попадут на stdin в netcat, который их отправит в сеть на порт 7777.

Все что нам осталось сделать это начать писать наши данные в этот именованный pipe.

У нас уже есть запущенное приложение:

[[email protected] ~]$ ps axuf | grep [o]pen
user  5946 99.8  0.0 128600  5744 pts/22   R+   11:27 169:27  |   \_ python openforwrite.py
[[email protected] ~]$ ls -lah /proc/5946/fd
total 0
dr-x------ 2 user user  0 Oct  8 11:27 .
dr-xr-xr-x 9 user user  0 Oct  8 11:27 ..
lrwx------ 1 user user 64 Oct  8 11:28 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:28 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:27 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  8 11:28 3 -> /mnt/logs/123. txt

Из всех флагов нам нужен только O_WRONLY так как файл уже существует и очищать нам его не нужно
[[email protected] ~]$ gdb -p 5946
...
(gdb) call open("/mnt/logs/megapipe", 00000001,0666)
$1 = 4
(gdb) shell ls -lah /proc/5946/fd
total 0
dr-x------ 2 user user  0 Oct  8 11:27 .
dr-xr-xr-x 9 user user  0 Oct  8 11:27 ..
lrwx------ 1 user user 64 Oct  8 11:28 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:28 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:27 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  8 11:28 3 -> /mnt/logs/123.txt
l-wx------ 1 user user 64 Oct  8 14:20 4 -> /mnt/logs/megapipe
(gdb) call dup2(4,3)
$2 = 3
(gdb) shell ls -lah /proc/5946/fd
total 0
dr-x------ 2 user user  0 Oct  8 11:27 .
dr-xr-xr-x 9 user user  0 Oct  8 11:27 ..
lrwx------ 1 user user 64 Oct  8 11:28 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:28 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:27 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  8 11:28 3 -> /mnt/logs/megapipe
l-wx------ 1 user user 64 Oct  8 14:20 4 -> /mnt/logs/megapipe
(gdb) call close(4)
$3 = 0
(gdb) shell ls -lah /proc/5946/fd
total 0
dr-x------ 2 user user  0 Oct  8 11:27 . 
dr-xr-xr-x 9 user user  0 Oct  8 11:27 ..
lrwx------ 1 user user 64 Oct  8 11:28 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:28 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:27 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  8 11:28 3 -> /mnt/logs/megapipe
(gdb) quit
A debugging session is active.

    Inferior 1 [process 5946] will be detached.

Quit anyway? (y or n) y
Detaching from program: /usr/bin/python2.7, process 5946

Проверяем удаленный сервер remote-server.example.com
[[email protected] ~]$ ls -lah 123.txt 
-rw-rw-r-- 1 user user 38M Oct  8 14:21 123.txt

Данные идут, проверяем проблемный сервер
[[email protected] ~]$ ls -lah /mnt/logs/
total 7.9M
drwxr-xr-x 2 user user 1.0K Oct  8 11:28 .
drwxr-xr-x 4 root     root     1.0K Oct  8 10:55 ..
-rw-rw-r-- 1 user user 7.9M Oct  8 14:17 123.txt
prw-rw-r-- 1 user user    0 Oct  8 14:22 megapipe

Данные сохранились, проблема решена.

Пользуясь случаем, передаю привет коллегам из компании Degiro.
Слушайте подкасты Радио-Т.

Всем добра.

В качестве домашнего задания предлагаю подумать, что будет в файл дескрипторах процесса cat и sleep если запустить такую команду:

[[email protected] ~]$ cat /dev/zero 2>/dev/null| sleep 10000

Программирование на Linux® на примерах [Книга]

«Это отличное введение в программирование на Linux. Темы хорошо подобраны и ясно представлены. Я узнал вещи я, особенно по поводу интернационализации, и я был на это довольно долгое время ».

— Чет Рэми, соавтор и сопровождающий Bash shell

«Это хорошее введение в программирование под Linux. Техника Арнольда, показывающая, как опытные программисты используют интерфейсы программирования Linux — приятный штрих, гораздо более полезный чем стандартные примеры программирования в большинстве книги.

— Ульрих Дреппер, руководитель проекта, GNU C библиотека

«Мягкое, но исчерпывающее введение в искусство UNIX. системное программирование, Программирование Linux по примеру использует код из широкого спектра знакомых программ для иллюстрации каждой концепции это учит. Читателям понравится интересное сочетание подробных API описания и рекомендации по переносимости, и будет хорошо готовы начать читать и писать системные приложения. Сердечно рекомендую ».

— Джим Мейеринг, соавтор и сопровождающий программы GNU Core Utility

Изучите программирование на Linux®, на практике … исходный код

Эта книга наиболее эффективно учит программированию на Linux. возможно: показывая и объясняя хорошо написанные программы.Рисунок как из V7 Unix®, так и из текущего исходного кода GNU, Арнольд Роббинс фокусируется на фундаментальных API системных вызовов, лежащих в основе любого значимая программа, представляющая примеры из программ, которые Пользователи Linux / Unix уже используют каждый день. Постепенно шаг за шагом время, Роббинс обучает принципам высокого уровня и Методы «под капотом». Попутно он тщательно решает реальные проблемы, такие как производительность, портативность и надежность. Покрытие включает:

  • Управление памятью

  • Файловый ввод / вывод

  • Метаданные файла

  • Процессы

  • Пользователи и группы

  • Сортировка и поиск

  • Анализ аргументов

    Расширенные интерфейсы

  • Сигналы

  • Интернационализация

  • Отладка

  • И многое другое…

  • Только учишься программировать? Переходите с Windows®? Уже разрабатывается с Linux, но заинтересован в изучении системного вызова интерфейс дальше? Независимо от того, что, быстро и прямо эта книга поможет вам освоить основы, необходимые для построения серьезное программное обеспечение Linux.

    Сопутствующие веб-сайты, авторы.phptr.com/robbins и www.linux-by-example.com , включая все примеры кода.

    Пример программирования для Linux — Арнольд Роббинс — 9780131429642 — Betriebssysteme

    Описание

    Подходит для всех курсов начального уровня по программированию Linux и Unix.

    Эта книга учит программированию на Linux одним из наиболее эффективных способов: , показывая и объясняя хорошо написанные программы. Арнольд Роббинс сосредотачивается на фундаментальных API системных вызовов Linux, которые образуют ядро ​​любой важной программы, и представляет код из производственных программ, с которыми пользователи Linux и Unix уже работают каждый день, начиная от исходного кода Unix и заканчивая утилит GNU, например ls и cp . Рассматриваемые темы и API включают: управление памятью; файловый ввод-вывод, метаинформация файла, процессы, пользователи и группы, сортировка, синтаксический анализ аргументов, расширенные интерфейсы, интернационализация, отладка и многое другое. Роббинс подчеркивает фундаментальные принципы программирования и часто предлагает как высокоуровневые, так и низкоуровневые подходы к ключевым задачам, помогая студентам понять, как все работает «под капотом». Он также демонстрирует, как решать реальные проблемы, возникающие при написании программного обеспечения, в частности производительность, переносимость и надежность. Все примеры кода можно загрузить с сопутствующего веб-сайта, и большинство из них одинаково хорошо применимы как к Linux, так и к Unix. Там, где есть различия, автор отмечает их. Программирование Linux на примере: основы предназначен для студентов, которые уже понимают основы C и / или C ++.

    Характеристики

    Идеальное введение в основы программирования для Linux для разработчиков, плохо знакомых с Linux — идеально для программистов Windows, совершающих переход!

    ° Примерное введение в основные программные интерфейсы Linux, которые необходимо освоить КАЖДОМУ разработчику Linux.

    ° Примеры являются «реальными», а не шаблонными, взятыми из АКТУАЛЬНОГО исходного кода в популярные программы GNU Linux.

    ° Написано автором бестселлеров «UNIX in a Nutshell» и других популярных книг О’Рейли.

    Содержание

    Предисловие.

    Аудитория. Что вы узнаете. Маленькое — это прекрасно: программы для Unix. Стандарты. Возможности и возможности: Программы GNU. Краткое содержание главы. Типографские условные обозначения. Где взять исходный код Unix и GNU. Код Unix. Код GNU.

    Благодарности.

    1. Введение.

    Файловая модель Linux / Unix. Модель процесса Linux / Unix.Стандартный C против оригинального C. Почему программы GNU лучше. Возвращение к переносимости. Рекомендуемая литература. Резюме. Упражнения.

    2. Аргументы, варианты и среда

    Условные обозначения вариантов и аргументов. Базовая обработка командной строки. Разбор опций: getopt () и getopt_long (). Окружающая среда. Резюме. Упражнения.

    3. Управление памятью на уровне пользователя

    Адресное пространство Linux / Unix. Выделение памяти. Резюме. Упражнения.

    4. Файлы и файловый ввод-вывод.

    Введение. Базовая структура программы. Определение того, что пошло не так. Вход и выход. Произвольный доступ: перемещение внутри файла. Создание файлов. Принудительный перенос данных на диск. Установка длины файла. Резюме. Упражнения.

    5. Каталоги и метаданные файлов.

    Справочник Содержание. Создание и удаление каталогов. Справочники чтения. Типы файлов и информация. Изменение владельца, разрешения и времени изменения. Резюме. Упражнения.

    6. Общие интерфейсы библиотеки — Часть 1

    Время и дата.Сортировка и поиск. Имена пользователей и групп. Терминалы: isatty (). Рекомендуемая литература. Резюме. Упражнения.

    7. Собираем все вместе: ls.

    V7 ls Опции. Кодекс V7 ls. Резюме. Упражнения.

    8. Файловые системы и обход каталогов.

    Монтирование и размонтирование файловых систем. Файлы администрирования файловой системы. Получение информации о файловой системе. Перемещение в файловой иерархии. Осмотр файлового дерева: GNU du. Изменение корневого каталога: chroot ().Резюме. Упражнения.

    9. Управление процессами и трубопроводы.

    Создание и управление процессами. Группы процессов. Базовое межпроцессное взаимодействие: каналы и FIFO. Управление файловыми дескрипторами. Пример: двусторонние каналы в gawk. Рекомендуемая литература. Резюме. Упражнения.

    10. Сигналы.

    Введение. Сигнальные действия. Стандартные сигналы C: signal () и raise (). Обработчики сигналов в действии. API сигналов System V Release 3: sigset () et al. Сигналы POSIX.Сигналы для межпроцессного взаимодействия. Важные сигналы специального назначения. Сигналы через fork () и exec (). Резюме. Упражнения.

    11. Идентификационные номера пользователей и групп и разрешения.

    Введение. Получение идентификаторов пользователей и групп. Проверка от имени реального пользователя: доступ (). Только GLIBC: проверка от имени E_ective User: euidaccess (). Дополнительные биты разрешения для каталогов. Установка реальных и E_ective идентификаторов. Только для Linux: getresuid () и setresuid (). Setuid root: Минное поле безопасности. Рекомендуемая литература.Резюме. Упражнения.

    12. Общие интерфейсы библиотеки — Часть 2.

    Заявление утверждений: assert (). Низкоуровневая память: функции memXXX (). Временные файлы. Совершение самоубийства: abort (). Нелокальные Gotos. Псевдослучайные числа. Расширения метасимволов. Обычные выражения. Рекомендуемая литература. Резюме. Упражнения.

    13. Интернационализация и локализация.

    Локали и библиотека C. Динамический перевод программных сообщений. Вы можете написать это для меня, пожалуйста? Рекомендуемая литература.Резюме. Упражнения.

    14. Расширенные интерфейсы.

    Выделение выровненной памяти: posix_memalign () и memalign (). Блокировка файлов. Более точное время. Расширенный поиск с помощью двоичных деревьев. Резюме. Упражнения

    15. Отладка.

    Что делать в первую очередь? Компиляция для отладки. Основы GDB. Программирование для отладки. Инструменты отладки. Тестирование программного обеспечения. Правила отладки. Рекомендуемая литература. Резюме. Упражнения.

    16. Связать воедино — проект.

    Описание проекта. Рекомендуемая литература.

    Приложение A. Научитесь программированию за десять лет.

    Почему все так спешат? Научитесь программированию за десять лет. Рекомендации. Ответы. Сноски.

    Приложение B. Лицензия Caldera Ancient UNIX.

    Приложение C. Стандартная общественная лицензия GNU.

    Преамбула.

    Условия копирования, распространения и изменения.

    Как применить эти Условия к вашим новым программам.

    Пример использования.

    Индекс.

    Задняя крышка

    «Это отличное введение в программирование под Linux. Темы хорошо подобраны и ясно представлены. Я сам кое-чему научился, особенно об интернационализации, и занимаюсь этим довольно давно ».

    -Чет Рэми, соавтор и сопровождающий оболочки Bash

    «Это хорошее введение в программирование под Linux.Техника Арнольда, показывающая, как опытные программисты используют программные интерфейсы Linux, — приятный штрих, гораздо более полезный, чем стандартные примеры программирования, которые можно найти в большинстве книг ».

    — Ульрих Дреппер, руководитель проекта, библиотека GNU C

    «Нежное, но подробное введение в искусство системного программирования UNIX, Программирование Linux на примере использует код из широкого диапазона знакомых программ для иллюстрации каждой концепции, которую он преподает. Читателям понравится интересное сочетание подробных описаний API и рекомендаций по переносимости, и они будут хорошо подготовлены, чтобы начать читать и писать системные приложения. Сердечно рекомендую ».

    — Джим Мейеринг, соавтор и сопровождающий программ GNU Core Utility

    Изучите программирование на Linux®, на практике… из реального исходного кода

    Эта книга учит программированию на Linux наиболее эффективным способом: показывая и объясняя -писанные программы. Основываясь как на V7 Unix®, так и на текущем исходном коде GNU, Арнольд Роббинс фокусируется на фундаментальных API системных вызовов, лежащих в основе любой важной программы, и представляет примеры из программ, которые пользователи Linux / Unix уже используют каждый день.Постепенно, шаг за шагом, Роббинс обучает принципам высокого уровня и методам «под капотом». Попутно он тщательно решает реальные проблемы, такие как производительность, портативность и надежность. Охват включает:

    • Управление памятью
    • Файловый ввод / вывод
    • Метаданные файла
    • Процессы
    • Пользователи и группы
    • Сортировка и поиск
    • Анализ аргументов
    • Расширенные интерфейсы
    • Сигналы
    • Интернационализация
    • Отладка
    • И еще…

    Только учишься программировать? Переходите с Windows®? Вы уже работаете с Linux, но хотите продолжить изучение интерфейса системных вызовов? Независимо от того, какой, быстро и прямо, эта книга поможет вам овладеть основами, необходимыми для создания серьезного программного обеспечения Linux.

    Сопутствующие веб-сайты, авторы.phptr.com/robbins и www.linux-by-example.com , включают все примеры кода.

    Автор

    Арнольд Роббинс — уроженец Атланты, в настоящее время проживает в Израиле. Он счастливый муж и гордый отец четверых замечательных детей. Он работает профессиональным инженером-программистом и техническим автором. В свое скудное свободное время он также является талмудистом-любителем, как вавилонским, так и иерусалимским.

    Арнольд работал с различными системами Unix, системами GNU / Linux, C, C ++ и всеми другими основными инструментами Unix с 1980 года.

    Как давний волонтер проекта GNU, он был сопровождающим GAWK (GNU Awk) на протяжении многих лет. Арнольд входил в состав комиссии по голосованию по исходному стандарту POSIX Shell и Utilities в начале 1990-х и помог сформировать стандарт POSIX для awk (и некоторых других вещей).

    Основы: Роббинс, Арнольд: Amazon.

    se: Книги

    «Это отличное введение в программирование под Linux. Темы хорошо выбраны и ясно представлены. Я сам кое-что узнал, особенно об интернационализации, и занимаюсь этим довольно давно».

    —Чет Рэми, соавтор и сопровождающий оболочки Bash

    «Это хорошее введение в программирование под Linux. Техника Арнольда, показывающая, как опытные программисты используют программные интерфейсы Linux, — приятный штрих, гораздо более полезный, чем найденные стандартные примеры программирования. в большинстве книг.«

    — Ульрих Дреппер, руководитель проекта, библиотека GNU C

    » Мягкое, но исчерпывающее введение в искусство системного программирования UNIX. «Программирование Linux на примере » использует код из широкого диапазона знакомых программ для иллюстрации каждой концепции, которой он учит. Читателям понравится интересное сочетание подробных описаний API и рекомендаций по переносимости, и они будут хорошо подготовлены, чтобы начать читать и писать системные приложения. Сердечно рекомендую ».

    — Джим Мейеринг, соавтор и сопровождающий программ GNU Core Utility. Изучите программирование Linux (R) на практике… из реального исходного кода

    Эта книга учит программированию под Linux наиболее эффективным способом: показывая и объясняя хорошо написанные программы. Основываясь как на V7 Unix (R), так и на текущем исходном коде GNU, Арнольд Роббинс сосредотачивается на фундаментальных API системных вызовов, лежащих в основе любой важной программы, представляя примеры программ, которые пользователи Linux / Unix уже используют каждый день. Постепенно, шаг за шагом, Роббинс обучает высокоуровневым принципам и методам «под капотом».Попутно он тщательно решает реальные проблемы, такие как производительность, портативность и надежность. Охват включает:

    • Управление памятью
    • Файловый ввод / вывод
    • Метаданные файла
    • Процессы
    • Пользователи и группы
    • Сортировка и поиск
    • Анализ аргументов
    • Расширенные интерфейсы
    • Сигналы
    • Интернационализация
    • Отладка
    • И еще . ..

    Только учишься программировать? Переходите с Windows (R)? Вы уже работаете с Linux, но хотите продолжить изучение интерфейса системных вызовов? Независимо от того, какой, быстро и прямо, эта книга поможет вам овладеть основами, необходимыми для создания серьезного программного обеспечения Linux.

    Сопутствующие веб-сайты, авторы.phptr.com/robbins и www.linux-by-example.com , включают все примеры кода.

    Арнольд Роббинс — уроженец Атланты, в настоящее время проживает в Израиле. Он счастливый муж и гордый отец четверых замечательных детей. Он работает профессиональным инженером-программистом и техническим автором. В свое скудное свободное время он также является талмудистом-любителем, как вавилонским, так и иерусалимским. Арнольд работает с различными системами Unix, системами GNU / Linux, C, C ++ и всеми другими основными инструментами Unix с 1980 года.Как давний волонтер проекта GNU, он много лет поддерживает GAWK (GNU Awk). Арнольд входил в состав комиссии по голосованию по исходному стандарту POSIX Shell и Utilities в начале 1990-х и помог сформировать стандарт POSIX для awk (и некоторых других вещей).

    Пример программирования для Linux — TechBookReport



    Ключевые слова: GNU, Linux, Unix, C, C ++

    Название: Пример программирования для Linux: основы

    Автор: Арнольд Роббинс

    Издатель: Prentice Hall — PTR

    ISBN: 0131429647

    Носитель: Книга

    Уровень: Начальный, средний

    Вердикт: Превосходная книга.Настоятельно рекомендуется

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

    Книга начинается с предпосылки, что один из лучших способов научиться программировать — это смотреть на хорошие программы.С этой целью Роббинс использует надежный код GNU / Linux из широкого набора утилит и системных инструментов, чтобы познакомить читателя с основными аспектами программирования Linux. Код здесь, чтобы проиллюстрировать хорошие (и плохие) практики, показать, как вещи развивались в мире Unix, а также указать на общие идиомы и хорошие идеи кодирования.

    Диапазон тем достаточно разнообразен для книги, в которой рассматриваются «основы»: файлы и пользователи, процессы и межпроцессное взаимодействие, а также последний раздел по отладке кода.Заявленная цель — изучить основы, в будущих выпусках такие вещи, как разработка графического интерфейса, будут рассмотрены отдельно. Впечатляет не только ассортимент материала, но и глубина. Темы освещаются хорошо, и никогда не возникает ощущения, что сложные вопросы замалчиваются.

    Хотя автор предполагает некоторые знания программирования на C и некоторые знания Linux, нет никаких предположений о каких-либо знаниях программирования Linux на языке C. Конечно, это не должно вызвать проблем для разработчика C в Windows, желающего получить доступ к Unix / Linux, фактически книга была бы идеальной для любого, кто хочет сделать этот переход.Книга начинается с абсолютных основ (файловой системы) и продолжается оттуда, причем каждый шаг естественным образом следует за предыдущим.

    Помимо механики написания твердого кода, есть еще подтекст. Одна из целей книги — показать читателю, что отличает код GNU / Linux не только по стилю, но и по философии. Философия открытого исходного кода очень четко просвечивает через код. Речь идет о коде, предназначенном для чтения, коде, предназначенном для совместного использования и максимальной переносимости между платформами Unix.Здесь нет большой работы по продаже, просто философия GNU отображается через код.

    Помимо прочного технического содержания, книгу выделяет ее текст. Роббинс овладел искусством разговаривать с читателем напрямую дружелюбным, обнадеживающим и очень привлекательным тоном. Такое ощущение, что бескорыстно делятся многолетним опытом. Это формула, которая делает эту книгу скорее отличной, чем просто хорошей.

    Без сомнения, это название, которое очень рекомендуется.Он заслуживает быть на каждой полке хакеров.


    Нажмите клавишу «Назад» в браузере, чтобы вернуться на страницу предметного указателя.

    Вернуться на главную страницу

    Основы: Роббинс, Арнольд: Amazon.sg: Книги

    «Это отличное введение в программирование под Linux. Темы хорошо выбраны и ясно представлены. Я сам кое-что узнал, особенно об интернационализации, и занимаюсь этим довольно давно».

    —Чет Рэми, соавтор и сопровождающий оболочки Bash

    «Это хорошее введение в программирование под Linux.Техника Арнольда, показывающая, как опытные программисты используют программные интерфейсы Linux, — приятный штрих, гораздо более полезный, чем стандартные примеры программирования, которые можно найти в большинстве книг ».

    — Ульрих Дреппер, руководитель проекта, библиотека GNU C

    « Мягкое, но подробное введение к искусству системного программирования UNIX, Программирование Linux на примере использует код из широкого диапазона знакомых программ для иллюстрации каждой концепции, которой он учит. Читателям понравится интересное сочетание подробных описаний API и рекомендаций по переносимости, и они будут хорошо подготовлены, чтобы начать читать и писать системные приложения. Сердечно рекомендую ».

    — Джим Мейеринг, соавтор и сопровождающий программ GNU Core Utility. Изучите программирование на Linux (R), на практике … из реального исходного кода. Возможный способ: показывая и объясняя хорошо написанные программы. Используя как V7 Unix (R), так и текущий исходный код GNU, Арнольд Роббинс сосредотачивается на фундаментальных API системных вызовов, лежащих в основе любой важной программы, представляя примеры из программ, которые Linux / Пользователи Unix уже пользуются каждый день.Постепенно, шаг за шагом, Роббинс обучает высокоуровневым принципам и методам «под капотом». Попутно он тщательно решает реальные проблемы, такие как производительность, портативность и надежность. Охват включает:

    • Управление памятью
    • Файловый ввод / вывод
    • Метаданные файла
    • Процессы
    • Пользователи и группы
    • Сортировка и поиск
    • Анализ аргументов
    • Расширенные интерфейсы
    • Сигналы
    • Интернационализация
    • Отладка
    • И больше. ..

    Только учишься программировать? Переходите с Windows (R)? Вы уже работаете с Linux, но хотите продолжить изучение интерфейса системных вызовов? Независимо от того, какой, быстро и прямо, эта книга поможет вам овладеть основами, необходимыми для создания серьезного программного обеспечения Linux.

    Сопутствующие веб-сайты, авторы.phptr.com/robbins и www.linux-by-example.com , включают все примеры кода.

    Арнольд Роббинс — уроженец Атланты, в настоящее время проживает в Израиле.Он счастливый муж и гордый отец четверых замечательных детей. Он работает профессиональным инженером-программистом и техническим автором. В свое скудное свободное время он также является талмудистом-любителем, как вавилонским, так и иерусалимским. Арнольд работал с различными системами Unix, системами GNU / Linux, C, C ++ и всеми другими основными инструментами Unix с 1980 года. В качестве давнего волонтера проекта GNU он поддерживал GAWK (GNU Awk ) на протяжении многих лет. Арнольд входил в состав комиссии по голосованию по исходному стандарту POSIX Shell и Utilities в начале 1990-х и помог сформировать стандарт POSIX для awk (и некоторых других вещей).

    9780789722157: Пример программирования для Linux — AbeBooks

    Linux Programming By Example знакомит программистов с некоторым опытом работы с C, но не знакомыми с особенностями программирования Linux, с основами системного программирования Linux и разработки приложений.Рассматриваемые темы включают использование инструментов разработки GNU, системное программирование, обработку файлов в Linux, межпроцессное взаимодействие, сетевое программирование, интерфейсы прикладного программирования, отладку и управление памятью, а также контроль версий и распространение программного обеспечения.

    «синопсис» может принадлежать к другой редакции этого названия.

    Краткое содержание :

    Для курсов Linux, посвященных программированию, где студенты имеют опыт программирования на C.Linux Programming By Example охватывает основы, позволяющие студентам начать программировать рабочие приложения в среде Linux. Предполагается, что студенты имеют некоторые знания C, но не имеют опыта работы с Linux. Он охватывает множество тем, включая использование инструментов разработки GNU, системное программирование, обработку файлов, отладку, управление памятью, сетевое программирование и интерфейсы прикладного программирования. Он также учит студентов, как использовать Linux в качестве операционной системы в полной мере.

    Об авторе :

    Курт Уолл использует UNIX с 1993 года и почти столько же привязан к Linux.В настоящее время он ведет FAQ по Informix on Linux и является президентом специальной группы по интересам Linux Международной группы пользователей Informix. Он является вице-президентом группы пользователей Linux в Солт-Лейк-Сити, где недавно выступил с презентацией по Linux и базам данных. Курт раньше работал в US West, а сейчас пишет и редактирует. Недавно он завершил свою первую книгу «Linux Programming Unleashed».

    «Об этом заглавии» может принадлежать другой редакции этого заглавия.

    Пример программирования для Linux

    — Slashdot

    Крейг Мэлони пишет: «« Linux Programming By Example »- это книга прямо на программистов, изучающих программирование Linux и UNIX система впервые ». Прочтите обзор Крейга « Программирование Linux с помощью примера »(ниже), чтобы узнать, как он оценивает, соответствует ли книга обещанию своего названия.
    Пример программирования для Linux
    автор Курт Уолл
    стр. 533
    издатель QUE (InformIT)
    рейтинг 9/10
    рецензент Крейг Мэлони
    ISBN 0789722151
    сводка «Программирование Linux на примере» — это краткое и основательное введение в программирование в системе Linux.Отличные инструкции сопровождают полностью работающие примеры кода.

    Книг по этой теме предостаточно как покажет любой поход в книжный магазин. Чем отличается эта книга по сравнению с другими книгами по программированию Linux его постоянная на протяжении. Другие книги, как правило, объясняют множество концепции, не связывая их с реальным примером. В книге Linux Programming By Example автор вводит концепцию и объясняет ее на примере. В последней главе автор объединяет представленные им знания, используя многие концепции книги при создании простой программы CD-Database. Конечно, не все концепции относятся к окончательной базе данных компакт-диска (главы «Программирование TCP / IP», «Звуковой API» и «Использование мыши» не упоминаются в окончательной программе), но это полезно для начинающих программистов, не понимающих, как все это кусочки вписываются в общую картину работающей программы.

    Начать сначала

    . Пример программирования для Linux. начинается с тем, которые не рассматриваются до конца многих книг.Книга начинается с обсуждения того, как использовать GCC и make на машине Linux, а также как создать Makefile. Меня всегда удивляло, почему в некоторых книгах не описывается компилятор или процесс сборки до конца. Какой в ​​этом смысл? Конечно, главы по отладке и RCS оставлены до конца книги, но представление ключевых концепций процесса разработки в начале книги помогает читателю лучше понять, как все эти концепции взаимосвязаны в среде Linux / UNIX.

    Двигаясь вперед

    От основ компиляции и создания программ книга переходит к основам системы Linux в Части II: Системное программирование.Вот где действительно сияет книга. В разделе, посвященном процессам, Уолл обсуждает элементы, из которых состоит процесс, как управлять процессом и почему вы все равно захотите это сделать. Книга не предполагает никаких предварительных знаний UNIX, но не продвигается вперед, как большинство вводных текстов. В разделе, посвященном сигналам, книга определяет, что такое сигналы, ранние API сигналов и их проблемы, API сигналов POSIX и Linux, а также способы использования сигналов и наборов сигналов. В этой главе автор перечисляет не только сигналы, поддерживаемые системой Linux, но и другие сигналы, поддерживаемые POSIX и другими системами UNIX.Хотя это может показаться запутанным, автор берет время, чтобы объяснить, какие сигналы действительно важны в среде Linux. Это ключевая причина, по которой эта книга сохраняет удобочитаемость без потери глубины. Каждая глава в разделе «Системное программирование» в книге сохраняет этот формат — не только демонстрируя, в чем состоит тема, но и показывает, какое место это занимает в системе Linux / UNIX и почему вам вообще нужно знать об этом.

    Что хорошего?

    Пример программирования для Linux явно нацелен на то, чтобы научить программистов быстрее программировать не только системы Linux, но и системы на основе POSIX.По возможности автор указывает на путь POSIX. Эту книгу можно было бы легко назвать POSIX Programming by Example . Автор также не скрывает проблем с реализацией Linux и способов реализации POSIX или System V. В книге четко указано, где Linux не соответствует полному стандарту POSIX и где могут возникнуть подводные камни при переносе кода из других систем. Это освежающее отличие от других текстов для начинающих, которые предполагают, что читатель обнаружит эти подводные камни самостоятельно.

    Так что в этом для меня?

    Если вы ищете быстрый и эффективный способ освоить программирование под Linux и UNIX без больших затрат, то книга Linux Programming by Example — это то, что вам нужно.