லினக்ஸ் எக்ஸெக் சிஸ்டம் கால்

Linux Exec System Call



செயலில் உள்ள ஒரு கோப்பை இயக்க exec கணினி அழைப்பு பயன்படுத்தப்படுகிறது. Exec என்று அழைக்கப்படும் போது முந்தைய இயங்கக்கூடிய கோப்பு மாற்றப்பட்டு புதிய கோப்பு செயல்படுத்தப்படும்.

இன்னும் துல்லியமாக, exec கணினி அழைப்பைப் பயன்படுத்துவது பழைய கோப்பு அல்லது நிரலை ஒரு புதிய கோப்பு அல்லது நிரலுடன் மாற்றும் என்று நாம் கூறலாம். செயல்முறையின் முழு உள்ளடக்கமும் ஒரு புதிய நிரலால் மாற்றப்படுகிறது.







Exec () கணினி அழைப்பைச் செயல்படுத்தும் பயனர் தரவுப் பிரிவு exec () ஐ அழைக்கும் போது வாதத்தில் வழங்கப்பட்ட தரவு கோப்புடன் மாற்றப்படுகிறது.



புதிய நிரல் அதே செயல்முறை இடத்திற்கு ஏற்றப்பட்டது. தற்போதைய செயல்முறை ஒரு புதிய செயல்முறையாக மாற்றப்பட்டுள்ளது, எனவே செயல்முறை ஐடி பிஐடி மாற்றப்படவில்லை, ஏனென்றால் நாங்கள் ஒரு புதிய செயல்முறையை உருவாக்கவில்லை, ஏனென்றால் ஒரு செயல்முறையை எக்ஸெக்கில் மற்றொரு செயல்முறையுடன் மாற்றுகிறோம்.



தற்போது இயங்கும் செயல்முறையில் ஒன்றுக்கு மேற்பட்ட நூல்கள் இருந்தால், அனைத்து நூல்களும் நிறுத்தப்பட்டு புதிய செயல்முறை படம் ஏற்றப்பட்டு பின்னர் செயல்படுத்தப்படும். தற்போதைய செயல்முறையின் இழைகளை முடிவுக்குக் கொண்டுவரும் அழிப்பான் செயல்பாடுகள் இல்லை.





செயல்முறையின் பிஐடி மாற்றப்படவில்லை ஆனால் செயல்முறையின் தரவு, குறியீடு, ஸ்டாக், குவியல் போன்றவை மாற்றப்பட்டு புதிதாக ஏற்றப்பட்ட செயல்முறையுடன் மாற்றப்படுகின்றன. புதிய செயல்முறை நுழைவு புள்ளியில் இருந்து செயல்படுத்தப்படுகிறது.

Exec கணினி அழைப்பு என்பது செயல்பாடுகளின் தொகுப்பாகும் மற்றும் C நிரலாக்க மொழியில், இந்த செயல்பாடுகளுக்கான நிலையான பெயர்கள் பின்வருமாறு:



  1. execl
  2. நிறைவேற்று
  3. execlp
  4. execv
  5. செயல்படுத்து
  6. execvp


இந்த செயல்பாடுகளுக்கு ஒரே அடிப்படை உள்ளது என்பதை இங்கே கவனிக்க வேண்டும் நிறைவேற்று ஒன்று அல்லது அதற்கு மேற்பட்ட கடிதங்கள். இவை கீழே விளக்கப்பட்டுள்ளன:

மற்றும்: இது சுற்றுச்சூழல் மாறிகளை சுட்டிக்காட்டும் மற்றும் புதிதாக ஏற்றப்பட்ட செயல்முறைக்கு வெளிப்படையாக அனுப்பப்படும் சுட்டிகளின் வரிசை.

: l என்பது கட்டளை வரி வாதங்களுக்கு ஒரு பட்டியலை செயல்பாட்டிற்கு அனுப்பியது

ப: p என்பது பாதை சூழல் மாறியாகும், இது செயல்முறையில் ஏற்றுவதற்கு ஒரு வாதமாக அனுப்பப்பட்ட கோப்பைக் கண்டுபிடிக்க உதவுகிறது.

v: v என்பது கட்டளை வரி வாதங்களுக்கானது. இவை செயல்பாட்டிற்கான சுட்டிகளின் வரிசையாக அனுப்பப்படுகின்றன.

Exec ஏன் பயன்படுத்தப்படுகிறது?

பயனர் அதே செயல்பாட்டில் ஒரு புதிய கோப்பு அல்லது நிரலைத் தொடங்க விரும்பும் போது exec பயன்படுத்தப்படுகிறது.

நிர்வாகியின் உள் வேலை

நிர்வாகியின் செயல்பாட்டைப் புரிந்துகொள்ள பின்வரும் புள்ளிகளைக் கவனியுங்கள்:

  1. தற்போதைய செயல்முறை படம் ஒரு புதிய செயல்முறை படத்துடன் மேலெழுதப்பட்டது.
  2. புதிய செயல்முறை படம் நீங்கள் exec வாதமாக நிறைவேற்றியது
  3. தற்போது இயங்கும் செயல்முறை முடிவடைந்தது
  4. புதிய செயல்முறை படம் அதே செயல்முறை ஐடி, அதே சூழல் மற்றும் அதே கோப்பு விளக்கத்தை கொண்டுள்ளது (செயல்முறை மாற்றப்படாததால் செயல்முறை படம் மாற்றப்பட்டது)
  5. CPU புள்ளி மற்றும் மெய்நிகர் நினைவகம் பாதிக்கப்படுகிறது. தற்போதைய செயல்முறை படத்தின் மெய்நிகர் நினைவக மேப்பிங் புதிய செயல்முறை படத்தின் மெய்நிகர் நினைவகத்தால் மாற்றப்படுகிறது.

நிர்வாக குடும்ப செயல்பாடுகளின் தொடரியல்:

Exec இன் ஒவ்வொரு செயல்பாட்டிற்கும் தொடரியல் பின்வருமாறு:

int execl (const char* path, const char* arg, ...)
int execlp (const char* file, const char* arg, ...)
int execle (const char* path, const char* arg, ..., char* const envp [])
int execv (const char* path, const char* argv [])
int execvp (const char* file, const char* argv [])
int execvpe (const char* file, const char* argv [], char* const envp [])

விளக்கம்:

இந்த செயல்பாடுகளின் திரும்பும் வகை Int ஆகும். செயல்முறை படம் வெற்றிகரமாக மாற்றப்படும் போது எதுவும் அழைப்பு செயல்பாட்டிற்கு திரும்பாது, ஏனெனில் அதை அழைத்த செயல்முறை இனி இயங்காது. ஆனால் ஏதேனும் பிழை இருந்தால் -1 திருப்பித் தரப்படும். ஏதேனும் பிழை ஏற்பட்டால் பிழை அமைக்கப்பட்டுள்ளது.

தொடரியலில்:

  1. பாதை செயல்படுத்தப்பட வேண்டிய கோப்பின் முழு பாதை பெயரை குறிப்பிட பயன்படுகிறது.
  1. கோபம் வாதம் நிறைவேற்றப்பட்டது. இது உண்மையில் செயல்பாட்டில் செயல்படுத்தப்படும் கோப்பின் பெயர். பெரும்பாலான நேரங்களில் ஆர்க் மற்றும் பாதையின் மதிப்பு ஒன்றுதான்.
  1. const char* arg செயல்பாடுகளில் execl (), execlp () மற்றும் execle () ஆகியவை arg0, arg1, arg2, ..., argn என கருதப்படுகிறது. இது அடிப்படையில் நிறுத்தப்பட்ட சரங்களை ரத்து செய்வதற்கான சுட்டிகளின் பட்டியல். இங்கே முதல் வாதம் கோப்பு பெயரை சுட்டிக்காட்டுகிறது, இது புள்ளி 2 இல் விவரிக்கப்பட்டுள்ளபடி செயல்படுத்தப்படும்.
  1. envp சுற்றுச்சூழல் மாறிகள் சுட்டிக்காட்டும் சுட்டிகளைக் கொண்டிருக்கும் ஒரு வரிசை ஆகும்.
  1. கோப்பு புதிய செயல்முறை படக் கோப்பின் பாதையை அடையாளம் காணும் பாதை பெயரை குறிப்பிட பயன்படுகிறது.
  1. Exec இன் செயல்பாடுகள் முடிவடைகிறது மற்றும் புதிய செயல்முறை படத்திற்கான சூழலை மாற்ற பயன்படுகிறது. இந்த செயல்பாடுகள் வாதத்தைப் பயன்படுத்தி சுற்றுச்சூழல் அமைப்புகளின் பட்டியலை அனுப்பும் envp . இந்த வாதம் எழுத்துகளின் வரிசையாகும், இது ரத்து செய்யப்பட்ட சரத்தை சுட்டிக்காட்டுகிறது மற்றும் சுற்றுச்சூழல் மாறியை வரையறுக்கிறது.

நிர்வாக குடும்ப செயல்பாடுகளைப் பயன்படுத்த, உங்கள் சி நிரலில் பின்வரும் தலைப்பு கோப்பை நீங்கள் சேர்க்க வேண்டும்:

#சேர்க்கிறது

எடுத்துக்காட்டு 1: சி நிரலில் exec கணினி அழைப்பைப் பயன்படுத்துதல்

உபுண்டுவின் லினக்ஸில் C நிரலாக்கத்தில் exec கணினி அழைப்பைப் பயன்படுத்திய பின்வரும் உதாரணத்தைக் கவனியுங்கள்: எங்களிடம் இரண்டு c கோப்புகள் இங்கே example.c மற்றும் hello.c:

உதாரணம். சி

குறியீடு:

#சேர்க்கிறது
#சேர்க்கிறது
#சேர்க்கிறது
intமுக்கிய(intargc, கரி *argv[])
{
printf (உதாரணமாக PID = c = %d n',getpid());
கரி *வாதிடுகிறார்[] = {'வணக்கம்', 'சி', 'புரோகிராமிங்',ஏதுமில்லை};
execv('./வணக்கம்',வாதிடுகிறார்);
printf ('எடுத்துக்காட்டுக்குத் திரும்பு');
திரும்ப 0;
}

வணக்கம். சி

குறியீடு:

#சேர்க்கிறது
#சேர்க்கிறது
#சேர்க்கிறது
intமுக்கிய(intargc, கரி *argv[])
{
printf ('நாங்கள் ஹலோ.சி யில் இருக்கிறோம் n');
printf ('PID of hello.c = %d n',getpid());
திரும்ப 0;
}

வெளியீடு:

உதாரணத்தின் PID = c = 4733
நாங்கள் Hello.c இல் இருக்கிறோம்
PID of hello.c = 4733

மேலே உள்ள எடுத்துக்காட்டில் எங்களிடம் ஒரு example.c கோப்பு மற்றும் hello.c கோப்பு உள்ளது. உதாரணம். சி கோப்பில் முதலில் நாம் நடப்பு செயல்முறையின் ஐடியை அச்சிட்டுள்ளோம் (கோப்பு எடுத்துக்காட்டு. சி தற்போதைய செயல்பாட்டில் இயங்குகிறது). அடுத்த வரியில், நாங்கள் எழுத்து சுட்டிகளின் வரிசையை உருவாக்கியுள்ளோம். இந்த வரிசையின் கடைசி உறுப்பு முடிவடையும் புள்ளியாக இருக்க வேண்டும்.

நாம் execv () என்ற செயல்பாட்டைப் பயன்படுத்தினோம், இது கோப்பு பெயர் மற்றும் எழுத்து சுட்டிக்காட்டி வரிசையை அதன் வாதமாக எடுத்துக்கொள்கிறது. நாம் பயன்படுத்தியதை இங்கே குறிப்பிட வேண்டும் ./ கோப்பின் பெயருடன், அது கோப்பின் பாதையை குறிப்பிடுகிறது. கோப்பு example.c வசிக்கும் கோப்புறையில் இருப்பதால், முழு பாதையையும் குறிப்பிட வேண்டிய அவசியமில்லை.

Execv () செயல்பாடு அழைக்கப்படும் போது, ​​எங்கள் செயல்முறை படம் இப்போது மாற்றப்படும். File.ex. கோப்பு செயல்பாட்டில் இல்லை ஆனால் hello.c கோப்பு செயல்பாட்டில் உள்ளது. செயல்முறை ஐடி என்பது hello.c செயல்முறை படமாக இருந்தாலும் அல்லது example.c என்பது செயல்முறை படமாக இருந்தாலும் செயல்முறை ஒரே மாதிரியாக இருப்பதைக் காணலாம்.

Execv () செயல்படுத்தப்படாத பிறகு printf () அறிக்கை எது என்பதை இங்கே நாம் கவனிக்க வேண்டும். ஏனென்றால் புதிய செயல்முறை படத்தை மாற்றிய பின் கட்டுப்பாடு பழைய செயல்முறை படத்திற்கு திரும்பாது. செயல்முறை படத்தை மாற்றுவது தோல்வியுற்றால் கட்டுப்பாடு அழைப்பு செயல்பாட்டிற்கு மட்டுமே வரும். (இந்த வழக்கில் திரும்பும் மதிப்பு -1).

ஃபோர்க் () மற்றும் exec () சிஸ்டம் அழைப்புகளுக்கு இடையிலான வேறுபாடு:

ஃபோர்க் () சிஸ்டம் கால் ஒரு இயங்கும் செயல்முறையின் சரியான நகலை உருவாக்க பயன்படுகிறது மற்றும் உருவாக்கப்பட்ட நகல் குழந்தை செயல்முறை மற்றும் இயங்கும் செயல்முறை பெற்றோர் செயல்முறை ஆகும். அதேசமயம், ஒரு செயல்முறை படத்தை புதிய செயல்முறை படத்துடன் மாற்றுவதற்கு exec () கணினி அழைப்பு பயன்படுத்தப்படுகிறது. எனவே exec () கணினி அழைப்பில் பெற்றோர் மற்றும் குழந்தை செயல்முறைகள் பற்றிய கருத்து இல்லை.

ஃபோர்க் () சிஸ்டத்தில் பெற்றோர் அழைப்பு மற்றும் குழந்தை செயல்முறைகள் ஒரே நேரத்தில் செயல்படுத்தப்படும். ஆனால் exec () கணினி அழைப்பில், செயல்முறைப் படத்தை மாற்றுவது வெற்றிகரமாக இருந்தால், கட்டுப்பாடு exec செயல்பாடு என்று அழைக்கப்படும் இடத்திற்குத் திரும்பாது மாறாக அது புதிய செயல்முறையை இயக்கும். ஏதேனும் பிழை இருந்தால் மட்டுமே கட்டுப்பாடு மீண்டும் மாற்றப்படும்.

எடுத்துக்காட்டு 2: ஃபோர்க் () மற்றும் exec () சிஸ்டம் அழைப்புகளை இணைத்தல்

ஒரே திட்டத்தில் நாம் ஃபோர்க் () மற்றும் exec () சிஸ்டம் அழைப்புகள் இரண்டையும் பயன்படுத்திய பின்வரும் உதாரணத்தைக் கவனியுங்கள்:

உதாரணம். சி

குறியீடு:

#சேர்க்கிறது
#சேர்க்கிறது
#சேர்க்கிறது
intமுக்கிய(intargc, கரி *argv[])
{
printf (உதாரணமாக PID = c = %d n',getpid());
pid_t ப;
=முள் கரண்டி();
என்றால்(== -1)
{
printf (ஃபோர்க் () ஐ அழைக்கும் போது பிழை உள்ளது);
}
என்றால்(==0)
{
printf (நாங்கள் குழந்தை செயல்பாட்டில் இருக்கிறோம் n');
printf (குழந்தை செயல்முறையில் இருந்து hello.c ஐ அழைக்கிறது n');
கரி *வாதிடுகிறார்[] = {'வணக்கம்', 'சி', 'புரோகிராமிங்',ஏதுமில்லை};
execv('./வணக்கம்',வாதிடுகிறார்);
}
வேறு
{
printf ('நாங்கள் பெற்றோர் செயல்பாட்டில் இருக்கிறோம்');
}
திரும்ப 0;
}

ஹலோ.சி:

குறியீடு:

#சேர்க்கிறது
#சேர்க்கிறது
#சேர்க்கிறது
intமுக்கிய(intargc, கரி *argv[])
{
printf ('நாங்கள் ஹலோ.சி யில் இருக்கிறோம் n');
printf ('PID of hello.c = %d n',getpid());
திரும்ப 0;
}

வெளியீடு:

உதாரணத்தின் பிஐடி. சி = 4790
நாங்கள் பெற்றோர் செயல்பாட்டில் இருக்கிறோம்
நாங்கள் குழந்தை செயல்பாட்டில் இருக்கிறோம்
குழந்தை செயல்முறையிலிருந்து hello.c ஐ அழைக்கிறது
நாங்கள் hello.c இல் இருக்கிறோம்
PID of hello.c = 4791

இந்த எடுத்துக்காட்டில் நாங்கள் ஃபோர்க் () கணினி அழைப்பைப் பயன்படுத்தினோம். குழந்தை செயல்முறை உருவாக்கப்படும் போது 0 p க்கு ஒதுக்கப்படும், பின்னர் நாங்கள் குழந்தை செயல்முறைக்கு செல்வோம். இப்போது (p == 0) உடன் அறிக்கைகளின் தொகுதி செயல்படுத்தப்படும். ஒரு செய்தி காட்டப்படும் மற்றும் நாங்கள் execv () கணினி அழைப்பு மற்றும் தற்போதைய குழந்தை செயல்முறை படத்தை உபயோகித்தோம். Execv () அழைப்புக்கு முன் குழந்தை மற்றும் பெற்றோர் செயல்முறைகள் ஒன்றே.

Example.c மற்றும் hello.c இன் PID இப்போது வேறுபட்டிருப்பதைக் காணலாம். ஏனென்றால் example.c என்பது பெற்றோர் செயல்முறைப் படம் மற்றும் hello.c என்பது குழந்தை செயல்முறைப் படம்.