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

Linux Exec System Call



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

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







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



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



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





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

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



  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). Приказује се порука и ми смо користили системски позив екецв () и тренутна слика процеса детета која је екампле.ц ће бити замењена са хелло.ц. Пре екецв () позивања подређени и родитељски процеси били су исти.

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