Демони су процеси који се не покрећу директно под контролом корисника већ служе у позадини. Обично почињу при покретању система и раде непрекидно док се систем не искључи. Једина разлика између ових и нормалних процеса је у томе што они ни на који начин не шаљу поруке на конзолу или екран.

Ево како можете да креирате демон на Линук машини.

Кратак увод у то како се стварају демони

Много демона ради на систему и неки познати примери демона су следећи:

  • цронд: Покреће команде у одређено време
  • ссхд: Омогућава пријаву на систем са удаљених машина
  • хттпд: Служи веб страницама
  • нфсд: Омогућава дељење датотека преко мреже

Такође, демонски процеси се обично именују тако да завршавају словом д, иако то није обавезно.

Да би се процес покренуо као демон, следи следећа путања:

  • Иницијалне операције, као што је читање конфигурационих датотека или добијање неопходних системских ресурса, морају се извршити пре него што процес постане демон. На овај начин систем може пријавити примљене грешке кориснику и процес ће бити прекинут одговарајућим кодом грешке.
  • instagram viewer
  • Позадински покренути процес се креира са инит као надређеним процесом. У ту сврху, потпроцес се прво рачва из инит процеса, а затим се горњи процес завршава излазом.
  • Нова сесија би требало да се отвори позивањем функције сетсид, а процес би требало да буде искључен са терминала.
  • Сви отворени дескриптори датотека наслеђени од надређеног процеса су затворени.
  • Стандардни улаз, излаз, а поруке о грешци се преусмеравају на /dev/null.
  • Радни директоријум процеса се мора променити.

Шта су демонске сесије?

Након пријаве на систем преко терминала, корисници могу покренути многе апликације кроз схелл програм. Ови процеси би требало да се затворе када корисник изађе из система. Оперативни систем групише ове процесе у групе сесија и процеса.

Свака сесија се састоји од процесних група. Ову ситуацију можете описати на следећи начин:

Терминал где процеси примају своје улазе и шаљу своје излазе назива се контролни терминал. Контролни терминал је повезан само са једном сесијом у исто време.

Сесија и процесне групе у њој имају идентификационе (ИД) бројеве; ови идентификациони бројеви су идентификациони бројеви процеса (ПИД) вођа сесије и процесних група. Подређени процес дели исту групу као и његов родитељски процес. Када је више процеса комуницирање са цевним механизмом, први процес постаје вођа групе процеса.

Креирање Даемон процеса на Линук-у

Овде ћете видети како можете да креирате демонску функцију. У ту сврху, креираћете функцију под називом _даемон. Можете почети тако што ћете именовати код апликације који ће радити као демон као тест.ц, и код под којим ћете креирати демонску функцију даемон.ц.

//test.c
#инцлуде <стдио.х>
инт_даемон(инт, инт);
интглавни()
{
гетцхар();
_даемон (0, 0);
гетцхар();
повратак0;
}
//daemon.c
#инцлуде <сис/типови.х>
#инцлуде <сис/стат.х>
#инцлуде <стдлиб.х>
#инцлуде <стдио.х>
#инцлуде <фцнтл.х>
#инцлуде <унистд.х>
#инцлуде <линук/фс.х>
#инцлуде <линук/лимитс.х>
инт_даемон(инт ноцхдир, инт ноцлосе){
пид_т пид;
пид = форк(); // Одвојите се од родитељског процеса
ако (пид < 0) {
излаз(ЕКСИТ_ФАИЛУРЕ);
}
ако (пид > 0) {
излаз(ЕКСИТ_СУЦЦЕСС);
}
повратак0;
}

Да бисте креирали демона, потребан вам је процес у позадини чији је родитељски процес инит. У коду изнад, _даемон креира подређени процес, а затим убија родитељски процес. У овом случају, ваш нови процес ће бити подпроцес инит и наставиће да ради у позадини.

Сада компајлирајте апликацију са следећом командом и испитајте статус процеса пре и после _деамон се зове:

гццтесттестдемон

Покрените апликацију и пређите на други терминал без притискања других тастера:

./тест

Можете видети да су вредности које се односе на ваш процес следеће. Овде ћете морати да користите команду пс да бисте добили информације везане за процес. У овом случају, _даемон функција још није позвана.

пс -Ц тест -о "пид ппид пгид сид тти статкоманда"
# Излаз
ПИД ППИД ПГИД СИД ТТ СТАТ КОМАНДА
10296 5119 10296 5117 птс/2 С+ ./тест

Када погледате на СТАТ поље, видите да је ваш процес покренут, али чека да се догоди догађај ван распореда који ће узроковати његово покретање у првом плану.

Скраћеница Значење
С Чекање у сну да се деси догађај
Т Апликација је заустављена
с Вођа сесије
+ Апликација ради у првом плану

Можете видети да је родитељски процес ваше апликације шкољка као што се и очекивало.

пс -јп 5119 
# Излаз
ПИД ПГИД СИД ТТИ ВРЕМЕ ЦМД
5119 5119 5117 птс/2 00:00:02 зсх

Сада се вратите на терминал где покрећете своју апликацију и притисните Ентер да се позове на _даемон функција. Затим поново погледајте информације о процесу на другом терминалу.

пс -Ц тест -о "пид ппид пгид сид тти статкоманда"
# Излаз
ПИД ППИД ПГИД СИД ТТ СТАТ КОМАНДА
22504 1 22481 5117 птс/2 С ./тест

Пре свега, можете рећи да нови подпроцес ради у позадини јер не видите + карактер у СТАТ поље. Сада испитајте ко је родитељски процес процеса користећи следећу команду:

пс -јп 1 
​​​​​​​# Излаз
ПИД ПГИД СИД ТТИ ВРЕМЕ ЦМД
1 1 1? 00:00:01системд

Сада можете видети да је родитељски процес вашег процеса системд процес. Горе је поменуто да би за следећи корак требало да се отвори нова сесија и да се процес искључи са контролног терминала. За ово користите функцију сетсид. Додајте овај позив у свој _даемон функција.

Комад кода за додавање је следећи:

иф (сетсид() == -1) 
повратак-1;

Сада када сте претходно прегледали стање _даемон позвани, сада можете уклонити први гетцхар функција у тест.ц код.

//test.c
#инцлуде <стдио.х>
инт_даемон(инт, инт);
интглавни()
{
_даемон (0, 0);
гетцхар();
повратак0;
}

Након што компајлирате и поново покренете апликацију, идите на терминал где сте направили своје рецензије. Нови статус вашег процеса је следећи:

пс -Ц тест -о "пид ппид пгид сид тти статкоманда"
​​​​​​​# Излаз
ПИД ППИД ПГИД СИД ТТ СТАТ КОМАНДА
25494 1 25494 25494? Сс ./тест

Тхе ? уписати се у ТТ поље означава да ваш процес више није повезан са терминалом. Приметите да је ПИД, ПГИД, и СИД вредности вашег процеса су исте. Ваш процес је сада лидер сесије.

У следећем кораку промените радни директоријум у основни директоријум према вредности аргумента који сте пренели. Можете додати следећи исечак у _даемон функција за ово:

иф (!ноцхдир) {
ако (цхдир("/") == -1)
повратак-1;
}

Сада, према пренетом аргументу, сви дескриптори датотека могу бити затворени. Додајте следећи код у _даемон функција:

#дефине НР_ОТВОРЕН 1024
иф (!ноцлосе) {
за (и = 0; и < НР_ОПЕН; и++)
затвори (и);
отвори ("/dev/нула", О_РДВР);
дуп (0);
дуп (0);
}

Након што су сви дескриптори датотека затворени, нове датотеке које је отворио демон ће бити приказане са дескрипторима 0, 1 и 2. У овом случају, на пример, принтф команде у коду ће бити усмерене на другу отворену датотеку. Да би се ово избегло, прва три идентификатора указују на /dev/null уређај.

У овом случају, коначно стање _даемон функција ће бити следећа:

#инцлуде <сис/типови.х>
#инцлуде <сис/стат.х>
#инцлуде <стдио.х>
#инцлуде <стдлиб.х>
#инцлуде <фцнтл.х>
#инцлуде <еррно.х>
#инцлуде <унистд.х>
#инцлуде <сислог.х>
#инцлуде <стринг.х>
инт_даемон(празнина){
// ПИД: ИД процеса
// СИД: ИД сесије
пид_т пид, сид;
пид = форк(); // Одвојите се од родитељског процеса
ако (пид < 0) {
излаз(ЕКСИТ_ФАИЛУРЕ);
}
ако (пид > 0) {
излаз(ЕКСИТ_СУЦЦЕСС);
}
// Креирај а СИДзадете
сид = сетсид();
ако (сид < 0) {
// ФАИЛ
излаз(ЕКСИТ_ФАИЛУРЕ);
}
ако ((цхдир("/")) < 0) {
// ФАИЛ
излаз(ЕКСИТ_ФАИЛУРЕ);
}
затвори (СТДИН_ФИЛЕНО);
затвори (СТДОУТ_ФИЛЕНО);
затвори (СТДЕРР_ФИЛЕНО);
док (1) {
// Неки задаци
спавати (30);
}
излаз(ЕКСИТ_СУЦЦЕСС);
}

Ево примера исечка кода који покреће ссхд примена као а демон:

...
иф (!(дебуг_флаг || инетд_флаг || но_даемон_флаг)) {
инт фд;
иф (демон (0, 0) < 0)
фаталан ("даемон() није успео: %.200с", стреррор (еррно));
/* Прекини везу са контролном тти. */
фд = отворен (_ПАТХ_ТТИ, О_РДВР | О_НОЦТТИ);
ако (фд >= 0) {
(празнина) иоцтл (фд, ТИОЦНОТТИ, НУЛЛ);
затворити (фд);
}
}
...

Демони су важни за програмирање Линук система

Демони су програми који обављају различите акције на унапред дефинисан начин постављене као одговор на одређене догађаје. Нечујно раде на вашој Линук машини. Они нису под директном контролом корисника и сваки сервис који ради у позадини има свог демона.

Важно је овладати демонима да бисте научили структуру језгра Линук оперативног система и разумели рад различитих системских архитектура.

Шта је демон?

Реад Нект

ОбјавиТвеетОбјавиЕмаил

Повезане теме

  • Линук
  • Линук Кернел
  • Програмирање
  • Ц Програмирање

О аутору

Фатих Куцуккаракурт (Објављено 5 чланака)

Инжењер и програмер софтвера који је љубитељ математике и технологије. Одувек је волео компјутере, математику и физику. Развио је пројекте мотора за игре, као и машинско учење, вештачке неуронске мреже и библиотеке линеарне алгебре. Штавише, наставља да ради на машинском учењу и линеарним матрицама.

Више од Фатих Куцуккаракурт

Претплатите се на наш билтен

Придружите се нашем билтену за техничке савете, рецензије, бесплатне е-књиге и ексклузивне понуде!

Кликните овде да бисте се претплатили