Системски позиви

Линук Екец системски позив

Линук Екец системски позив

Системски позив екец користи се за извршавање датотеке која се налази у активном процесу. Када се позове екец, претходна извршна датотека се замењује и извршава нова.

Тачније, можемо рећи да ће употреба екец системског позива заменити стару датотеку или програм из процеса новом датотеком или програмом. Читав садржај поступка замењује се новим програмом.

Сегмент корисничких података који извршава системски позив екец () замењује се датотеком података чије је име дато у аргументу док се позива екец ().

Нови програм се учитава у исти процесни простор. Тренутни процес је управо претворен у нови процес и стога се ИД процеса не мења, то је зато што не стварамо нови процес већ само замењујемо процес другим процесом у извршном програму.

Ако тренутно покренут процес садржи више нити, тада ће се све нити прекинути, а нова слика процеса ће се учитати и извршити. Не постоје функције деструктора које завршавају нити тренутног процеса.

ПИД процеса се не мења, већ подаци, код, стек, гомила итд. процеса се мењају и замењују онима из ново учитаних процеса. Нови поступак се извршава од улазне тачке.

Екец системски позив је скуп функција и на програмском језику Ц стандардни називи ових функција су следећи:

  1. екецл
  2. екецле
  3. екецлп
  4. екецв
  5. екецве
  6. екецвп


Овде треба напоменути да ове функције имају исту базу екец праћено једним или више слова. Они су објашњени у наставку:

е: То је низ показивача који упућују на променљиве окружења и експлицитно се прослеђују ново учитаном процесу.

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

п: п је променљива окружења путање која помаже у проналажењу датотеке прослеђене као аргумент за учитавање у процес.

в: в је за аргументе наредбеног ретка. Они се преносе као низ показивача на функцију.

Зашто се користи екец?

екец се користи када корисник жели да покрене нову датотеку или програм у истом процесу.

Унутрашњи рад изврш

Размотрите следеће тачке да бисте разумели рад екец-а:

  1. Тренутна слика процеса се преписује новом сликом процеса.
  2. Нова слика процеса је она коју сте проследили као екец аргумент
  3. Тренутно покренут поступак је завршен
  4. Нова слика процеса има исти ИД процеса, исто окружење и исти дескриптор датотеке (јер се процес не замењује, замењује се слика процеса)
  5. То утиче на статус ЦПУ и виртуелну меморију. Мапирање виртуелне меморије тренутне слике процеса замењено је виртуелном меморијом нове слике процеса.

Синтакса функција породице екец:

Следе синтаксе за сваку функцију екец:

инт екецл (цонст цхар * путања, цонст цхар * арг,…)
инт екецлп (датотека цонст цхар *, цонст цхар * арг,…)
инт екецле (цонст цхар * путања, цонст цхар * арг,…, цхар * цонст енвп [])
инт екецв (цонст цхар * путања, цонст цхар * аргв [])
инт екецвп (датотека цонст цхар *, цонст цхар * аргв [])
инт екецвпе (датотека цонст цхар *, цонст цхар * аргв [], цхар * цонст енвп [])

Опис:

Тип повратка ових функција је Инт. Када се слика процеса успешно замени, ништа се не враћа функцији позивања јер процес који ју је позвао више није покренут. Али ако постоји било каква грешка, вратиће се -1. Ако се деси било каква грешка, еррно је постављено.

У синтакси:

  1. пут користи се за одређивање пуног имена путање датотеке која се треба извршити.
  1. арг је прослеђени аргумент. То је заправо име датотеке која ће се извршити у процесу. Већина пута је вредност арг и путања иста.
  1. цонст цхар * арг у функцијама екецл (), екецлп () и екецле () сматра се арг0, арг1, арг2,…, аргн. То је у основи листа показивача на нулу завршене низове. Овде први аргумент указује на име датотеке које ће се извршити како је описано у тачки 2.
  1. енвп је низ који садржи показиваче који воде до променљивих околине.
  1. датотека користи се за одређивање имена путање које ће идентификовати путању нове датотеке слике процеса.
  1. Функције екец позива које се завршавају са е користе се за промену окружења за нову слику процеса. Ове функције прослеђују листу поставки окружења помоћу аргумента енвп. Овај аргумент је низ знакова који упућује на нулу завршени низ и дефинише променљиву окружења.

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

#инцлуде

Пример 1: Коришћење извршног системског позива у програму Ц

Размотрите следећи пример у којем смо користили екец системски позив у програмирању на Ц-у у Линук-у, Убунту: Овде имамо две ц датотеке.ц и здраво.ц:

пример.ц

ШИФРА:

#инцлуде
#инцлуде
#инцлуде
инт маин (инт аргц, цхар * аргв [])

принтф ("ПИД примера.ц =% д \ н ", гетпид ());
цхар * аргс [] = "Здраво", "Ц", "Програмирање", НУЛЛ;
екецв ("./ здраво ", аргс);
принтф ("Назад на пример.ц ");
ретурн 0;

Здраво.ц

ШИФРА:

#инцлуде
#инцлуде
#инцлуде
инт маин (инт аргц, цхар * аргв [])

принтф ("Налазимо се у Хелло.ц \ н ");
принтф ("ПИД здраво.ц =% д \ н ", гетпид ());
ретурн 0;

ИЗЛАЗ:

ПИД примера.ц = 4733
Ми смо у Здраво.ц
ПИД здраво.ц = 4733

У горњем примеру имамо пример.ц фајл и здраво.ц датотека. У примеру .ц датотеку пре свега смо одштампали ИД тренутног процеса (пример датотеке.ц је покренут у тренутном процесу). Затим смо у следећем реду креирали низ показивача на знакове. Последњи елемент овог низа треба да буде НУЛЛ као завршна тачка.

Затим смо користили функцију екецв () која за аргумент узима име датотеке и низ показивача знакова. Овде треба напоменути да смо користили ./ са именом датотеке, одређује путању датотеке. Како се датотека налази у фасцикли у којој је пример.ц се налази, тако да нема потребе за одређивањем пуне путање.

Када се позове функција екецв (), наша слика процеса ће бити замењена сада примером датотеке.ц није у процесу, али датотека је здрава.ц је у процесу. Може се видети да је ИД процеса исти, било да је здраво.ц је слика процеса или пример.ц је слика процеса јер је процес исти и слика процеса се само замењује.

Затим овде имамо још једну ствар коју треба приметити, а то је изјава принтф () након што се екецв () не изврши. То је зато што се контрола никада не враћа натраг на стару слику процеса када је нова слика процеса замени. Контрола се враћа функцији позивања само када је замена слике процеса неуспешна. (Повратна вредност је -1 у овом случају).

Разлика између форк () и екец () системских позива:

Системски позив форк () користи се за стварање тачне копије текућег процеса, а креирана копија је подређени процес, а текући процес је надређени процес. Док се системски позив екец () користи за замену слике процеса новом сликом процеса. Отуда не постоји концепт родитељског и подређеног процеса у системском позиву екец ().

У системском позиву форк () истовремено се извршавају надређени и подређени процеси. Али у системском позиву екец (), ако је замена слике процеса успешна, контрола се не враћа тамо где је позвана функција екец, већ ће извршити нови процес. Контрола ће бити враћена натраг само ако постоји грешка.

Пример 2: Комбиновање форк () и екец () системских позива

Размотрите следећи пример у којем смо користили системске позиве форк () и екец () у истом програму:

пример.ц

ШИФРА:

#инцлуде
#инцлуде
#инцлуде
инт маин (инт аргц, цхар * аргв [])

принтф ("ПИД примера.ц =% д \ н ", гетпид ());
пид_т п;
п = виљушка ();
ако (п == - 1)

принтф ("Дошло је до грешке приликом позивања форк ()");

ако (п == 0)

принтф ("Ми смо у подређеном процесу \ н");
принтф ("Позивање здраво.ц из процеса детета \ н ");
цхар * аргс [] = "Здраво", "Ц", "Програмирање", НУЛЛ;
екецв ("./ здраво ", аргс);

иначе

принтф ("У родитељском смо процесу");

ретурн 0;

Здраво.ц:

ШИФРА:

#инцлуде
#инцлуде
#инцлуде
инт маин (инт аргц, цхар * аргв [])

принтф ("Налазимо се у Хелло.ц \ н ");
принтф ("ПИД здраво.ц =% д \ н ", гетпид ());
ретурн 0;

ИЗЛАЗ:

ПИД примера.ц = 4790
Ми смо у родитељском процесу
Ми смо у процесу детета
Зовем здраво.ц из процеса детета
Здраво смо.ц
ПИД здраво.ц = 4791

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

Може се видети да ПИД примера.ц и здраво.ц је сада другачије. То је зато што пример.ц је слика родитељског процеса и здраво.ц је слика процеса детета.

Како развити игру на Линуку
Пре деценију, није много корисника Линука предвидело да ће њихов омиљени оперативни систем једног дана бити популарна платформа за играње комерцијални...
Портови комерцијалних игара отвореног кода
Бесплатне рекреације покретачких игара са отвореним кодом и више платформи могу се користити за играње старих, као и неких прилично недавних наслова и...
Најбоље игре командне линије за Линук
Командна линија није само ваш највећи савезник када користите Линук - она ​​такође може бити извор забаве јер је можете користити за играње многих заб...