لینکس ایکزیک سسٹم کال۔

Linux Exec System Call



ایگزیکٹ سسٹم کال ایک فائل کو چلانے کے لیے استعمال کی جاتی ہے جو ایک فعال عمل میں رہتی ہے۔ جب exec کہا جاتا ہے پچھلی قابل عمل فائل کو تبدیل کر دیا جاتا ہے اور نئی فائل کو پھانسی دی جاتی ہے۔

زیادہ واضح طور پر ، ہم یہ کہہ سکتے ہیں کہ ایگزیکٹو سسٹم کال کے استعمال سے پرانی فائل یا پروگرام کو نئی فائل یا پروگرام سے تبدیل کر دیا جائے گا۔ عمل کے پورے مواد کو ایک نئے پروگرام کے ساتھ تبدیل کر دیا گیا ہے۔







یوزر ڈیٹا سیکشن جو کہ ایگزیکٹو () سسٹم کال پر عمل کرتا ہے اس کو ڈیٹا فائل سے تبدیل کیا جاتا ہے جس کا نام ایگزیکٹو () کو کال کرتے ہوئے دلیل میں فراہم کیا جاتا ہے۔



نیا پروگرام اسی عمل کی جگہ پر بھرا ہوا ہے۔ موجودہ عمل صرف ایک نئے عمل میں بدل گیا ہے اور اسی وجہ سے پروسیس آئی ڈی پی آئی ڈی کو تبدیل نہیں کیا گیا ہے ، اس کی وجہ یہ ہے کہ ہم کوئی نیا عمل نہیں بنا رہے ہیں بلکہ ہم صرف ایک عمل کو ایک دوسرے عمل کے ساتھ ایگزیکٹو میں تبدیل کر رہے ہیں۔



اگر فی الحال چلنے والے عمل میں ایک سے زیادہ دھاگے شامل ہیں تو تمام تھریڈز کو ختم کر دیا جائے گا اور نئی عمل کی تصویر لوڈ کی جائے گی اور پھر اس پر عمل درآمد کیا جائے گا۔ کوئی تخریب کار نہیں ہیں جو موجودہ عمل کے دھاگوں کو ختم کرتے ہیں۔





عمل کا پی آئی ڈی تبدیل نہیں کیا جاتا ہے بلکہ اس عمل کا ڈیٹا ، کوڈ ، اسٹیک ، ہیپ وغیرہ تبدیل کر دیا جاتا ہے اور اسے نئے بھری ہوئی پروسیس سے تبدیل کر دیا جاتا ہے۔ نیا عمل انٹری پوائنٹ سے عمل میں لایا جاتا ہے۔

ایگزیک سسٹم کال افعال کا مجموعہ ہے اور سی پروگرامنگ زبان میں ، ان افعال کے معیاری نام درج ذیل ہیں۔



  1. مثال کے طور پر
  2. نکالیں
  3. مثال کے طور پر
  4. execv
  5. عملدرآمد
  6. execvp


یہاں یہ نوٹ کرنا چاہیے کہ ان افعال کا ایک ہی بنیاد ہے۔ عملدرآمد اس کے بعد ایک یا زیادہ خطوط۔ ان کی وضاحت ذیل میں کی گئی ہے:

اور: یہ اشاروں کی ایک صف ہے جو ماحولیاتی متغیرات کی طرف اشارہ کرتی ہے اور واضح طور پر نئے بھری ہوئی عمل کو منتقل کی جاتی ہے۔

: l کمانڈ لائن دلائل کے لیے ہے جو فنکشن میں ایک فہرست کو منتقل کرتا ہے۔

p: p راستے کا ماحول متغیر ہے جو عمل میں لادنے کے لیے بطور دلیل فائل کو تلاش کرنے میں مدد کرتا ہے۔

v: v کمانڈ لائن دلائل کے لیے ہے۔ یہ فنکشن کی طرف اشارے کی ایک صف کے طور پر منظور کیے جاتے ہیں۔

exec کیوں استعمال کیا جاتا ہے؟

exec استعمال کیا جاتا ہے جب صارف اسی عمل میں نئی ​​فائل یا پروگرام لانچ کرنا چاہتا ہے۔

عملدرآمد کا اندرونی کام۔

ایگزیکٹو کے کام کو سمجھنے کے لیے درج ذیل نکات پر غور کریں:

  1. موجودہ پروسیس امیج کو ایک نئی پروسیس امیج کے ساتھ اوور رائٹ کیا جاتا ہے۔
  2. عمل کی نئی تصویر وہ ہے جو آپ نے ایگزیکٹو دلیل کے طور پر منظور کی ہے۔
  3. فی الحال چلنے والا عمل ختم ہو گیا ہے۔
  4. نئی پروسیس امیج میں ایک ہی پروسیس آئی ڈی ، وہی ماحول اور ایک ہی فائل ڈسریکٹر ہوتا ہے (کیونکہ پروسیس کو تبدیل نہیں کیا جاتا پروسیس امیج کو تبدیل کیا جاتا ہے)
  5. CPU اسٹیٹ اور ورچوئل میموری متاثر ہوتی ہے۔ موجودہ پروسیس امیج کی ورچوئل میموری میپنگ کی جگہ نئی پروسیس امیج کی ورچوئل میموری ہے۔

ایگزیکٹو فیملی افعال کے نحو:

عمل کے ہر فنکشن کے لیے نحو مندرجہ ذیل ہیں۔

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. ناراض دلیل گزر گئی ہے یہ دراصل فائل کا نام ہے جو عمل میں لایا جائے گا۔ اکثر اوقات arg اور path کی قدر ایک جیسی ہوتی ہے۔
  1. const char* arg افعال میں execl () ، execlp () اور execle () arg0 ، arg1 ، arg2 ،… ، argn سمجھا جاتا ہے۔ یہ بنیادی طور پر ختم ہونے والے ڈور کے اشاروں کی ایک فہرست ہے۔ یہاں پہلی دلیل فائل کے نام کی طرف اشارہ کرتی ہے جس پر عمل کیا جائے گا جیسا کہ پوائنٹ 2 میں بیان کیا گیا ہے۔
  1. envp ایک صف ہے جس میں پوائنٹر ہوتے ہیں جو ماحول کے متغیرات کی طرف اشارہ کرتے ہیں۔
  1. فائل راستے کا نام بتانے کے لیے استعمال کیا جاتا ہے جو کہ نئی پروسیس امیج فائل کے راستے کی شناخت کرے گا۔
  1. ایگزیک کال کے افعال جو ختم ہوتے ہیں۔ اور نئے عمل کی تصویر کے لیے ماحول کو تبدیل کرنے کے لیے استعمال کیا جاتا ہے۔ یہ افعال دلیل کا استعمال کرتے ہوئے ماحول کی ترتیب کی فہرست کو منتقل کرتے ہیں۔ envp . یہ دلیل حروف کی ایک صف ہے جو کالعدم سٹرنگ کی طرف اشارہ کرتی ہے اور ماحولیاتی متغیر کی وضاحت کرتی ہے۔

ایگزیکٹو فیملی افعال کو استعمال کرنے کے لیے ، آپ کو اپنے سی پروگرام میں درج ذیل ہیڈر فائل کو شامل کرنے کی ضرورت ہے۔

#شامل کریں

مثال 1: سی پروگرام میں ایگزیکٹ سسٹم کال کا استعمال۔

مندرجہ ذیل مثال پر غور کریں جس میں ہم نے لینکس ، اوبنٹو میں سی پروگرامنگ میں ایگزیکٹو سسٹم کال استعمال کی ہے: ہمارے یہاں دو سی فائلیں ہیں example.c اور hello.c:

example.c

کوڈ:

#شامل کریں
#شامل کریں
#شامل کریں
intمرکزی(intargc، چار *argv[])
{
پرنٹ ایف (مثال کی پی آئی ڈی =٪ dn'،getpid())؛
چار *دلائل[] = {'ہیلو'، 'سی'، 'پروگرامنگ'،خالی}؛
execv('./ہیلو'،دلائل)؛
پرنٹ ایف ('example.c پر واپس جائیں')؛
واپسی ؛
}

hello.c

کوڈ:

#شامل کریں
#شامل کریں
#شامل کریں
intمرکزی(intargc، چار *argv[])
{
پرنٹ ایف ('ہم Hello.c میں ہیں۔n')؛
پرنٹ ایف ('hello.c =٪ d کی PIDn'،getpid())؛
واپسی ؛
}

آؤٹ پٹ:

example.c = 4733 کی پی آئی ڈی۔
ہم Hello.c میں ہیں۔
ہیلو کی پی آئی ڈی = 4733

مندرجہ بالا مثال میں ہمارے پاس ایک example.c فائل اور hello.c فائل ہے۔ مثال کے طور پر .c فائل میں سب سے پہلے ہم نے موجودہ عمل کی آئی ڈی پرنٹ کی ہے (فائل example.c موجودہ عمل میں چل رہی ہے)۔ پھر اگلی لائن میں ہم نے کریکٹر پوائنٹرز کی ایک صف تیار کی ہے۔ اس صف کا آخری عنصر ختم ہونے کے نقطہ کے طور پر NULL ہونا چاہئے۔

پھر ہم نے فنکشن execv () استعمال کیا ہے جو فائل کا نام اور کریکٹر پوائنٹر سرے کو اس کی دلیل کے طور پر لیتا ہے۔ یہاں یہ نوٹ کرنا چاہیے کہ ہم نے فائل کے نام کے ساتھ ./ استعمال کیا ہے ، یہ فائل کا راستہ بتاتا ہے۔ جیسا کہ فائل اس فولڈر میں ہے جہاں example.c رہتا ہے لہذا مکمل راستہ بتانے کی ضرورت نہیں ہے۔

جب execv () فنکشن کہا جاتا ہے ، ہماری پروسیس امیج اب تبدیل ہو جائے گی فائل example.c عمل میں نہیں ہے لیکن فائل hello.c عمل میں ہے۔ یہ دیکھا جاسکتا ہے کہ پروسیس آئی ڈی ایک جیسی ہے چاہے hello.c پروسیس امیج ہو یا example.c پروسیس امیج ہے کیونکہ پروسیس ایک جیسا ہے اور پروسیس امیج کو صرف تبدیل کیا جاتا ہے۔

پھر ہمارے یہاں ایک اور بات نوٹ کرنے کی ہے جو کہ ہے۔ اس کی وجہ یہ ہے کہ ایک بار نئی پروسیس امیج اس کی جگہ لینے کے بعد پرانے عمل کی تصویر پر واپس نہیں آتی ہے۔ کنٹرول صرف کالنگ فنکشن پر واپس آتا ہے جب پروسیس امیج کو تبدیل کرنا ناکام ہو۔ (واپسی کی قیمت اس معاملے میں -1 ہے)۔

فورک () اور exec () سسٹم کالز کے درمیان فرق:

فورک () سسٹم کال چلنے والے عمل کی عین مطابق کاپی بنانے کے لیے استعمال کی جاتی ہے اور بنائی گئی کاپی چائلڈ پروسیس ہوتی ہے اور چلنے والا عمل والدین کا عمل ہوتا ہے۔ جبکہ ، عمل () سسٹم کال ایک پروسیس امیج کو نئی پروسیس امیج سے بدلنے کے لیے استعمال ہوتی ہے۔ لہذا exec () سسٹم کال میں والدین اور بچوں کے عمل کا کوئی تصور نہیں ہے۔

فورک () سسٹم میں والدین اور بچوں کے عمل کو ایک ہی وقت میں انجام دیا جاتا ہے۔ لیکن ایگزیکٹو () سسٹم کال میں ، اگر پروسیس امیج کی تبدیلی کامیاب ہوتی ہے تو ، کنٹرول واپس نہیں آتا جہاں پر ایگزیکٹو فنکشن بلایا گیا تھا بلکہ یہ نئے عمل کو انجام دے گا۔ اگر کوئی خرابی ہو تو کنٹرول کو واپس منتقل کیا جائے گا۔

مثال 2: فورک () اور exec () سسٹم کالز کو یکجا کرنا۔

مندرجہ ذیل مثال پر غور کریں جس میں ہم نے ایک ہی پروگرام میں فورک () اور exec () سسٹم کالز دونوں استعمال کیے ہیں۔

example.c

کوڈ:

#شامل کریں
#شامل کریں
#شامل کریں
intمرکزی(intargc، چار *argv[])
{
پرنٹ ایف (مثال کی پی آئی ڈی =٪ dn'،getpid())؛
pid_t p؛
p=کانٹا()؛
اگر(p== -)
{
پرنٹ ایف ('فورک () پر کال کرتے ہوئے ایک خرابی ہے')؛
}
اگر(p==)
{
پرنٹ ایف ('ہم بچے کے عمل میں ہیں۔n')؛
پرنٹ ایف (بچے کے عمل سے hello.c کو کال کرنا۔n')؛
چار *دلائل[] = {'ہیلو'، 'سی'، 'پروگرامنگ'،خالی}؛
execv('./ہیلو'،دلائل)؛
}
اور
{
پرنٹ ایف ('ہم والدین کے عمل میں ہیں')؛
}
واپسی ؛
}

hello.c:

کوڈ:

#شامل کریں
#شامل کریں
#شامل کریں
intمرکزی(intargc، چار *argv[])
{
پرنٹ ایف ('ہم Hello.c میں ہیں۔n')؛
پرنٹ ایف ('hello.c =٪ d کی PIDn'،getpid())؛
واپسی ؛
}

آؤٹ پٹ:

example.c = 4790 کی پی آئی ڈی۔
ہم والدین کے عمل میں ہیں۔
ہم چائلڈ پروسیس میں ہیں۔
بچے کے عمل سے hello.c کو کال کرنا۔
ہم hello.c میں ہیں۔
ہیلو کی پی آئی ڈی = 4791

اس مثال میں ہم نے فورک () سسٹم کال استعمال کی ہے۔ جب بچہ کا عمل بن جائے گا 0 کو p کو تفویض کیا جائے گا اور پھر ہم بچے کے عمل کی طرف جائیں گے۔ اب اگر (p == 0) کے ساتھ بیانات کا بلاک عمل میں لایا جائے گا۔ ایک پیغام دکھایا گیا ہے اور ہم نے execv () سسٹم کال اور موجودہ چائلڈ پروسیس امیج کا استعمال کیا ہے جو مثال ہے۔ c کی جگہ hello.c ہو گی۔ execv () کال سے پہلے بچے اور والدین کے عمل ایک جیسے تھے۔

یہ دیکھا جا سکتا ہے کہ example.c اور hello.c کی PID اب مختلف ہے۔ اس کی وجہ یہ ہے کہ example.c والدین کے عمل کی تصویر ہے اور hello.c بچے کے عمل کی تصویر ہے۔