Exec

بندانگشتی|نحوه کار Exec

**exec**، قابلیتی در سیستم‌عامل است که یک فایل اجرایی را در زمینه  فرایند فعلی اجرا می‌کند. اجرای exec باعث می‌شود تصویر فرایند جدید، جایگزین تصویر فرایند فعلی شود (منظور از تصویر فرایند پشته، بخش کد، هیپ و ... است). به این کار **جای‌گذاشت**  هم گفته می‌شود. با اجرای exec، فرایند جدیدی ایجاد نمی‌شود، شناسه فرایند فعلی هم تغییر نمی‌کند، اما کد ماشین، داده‌ها، پشته و هیپ برنامه جدید با برنامه فعلی جایگزین می‌شود. exec در بسیاری از زبان‌های برنامه‌نویسی از جمله زبان‌های کامپایلی و اسکریپتی موجود است. در مفسرهای فرمان سیستم‌عامل، یک دستور توکار به نام exec وجود دارد که فرایند پوسته را با یک برنامه دیگر جایگزین می‌کند.

در پوسته‌ها از fork() و exec برای اجرا کردن یک برنامه استفاده می‌شود. وقتی که کاربری دستور اجرا کردن برنامه‌ای مانند /bin/ls را صادر می‌کند، پوسته ابتدا یک فرایند فرزند به کمک fork() ایجاد می‌کند که این فرایند فرزند دقیقاً مانند فرایند والد است (به جز شناسه فرایند). سپس فرایند فرزند با اجرای exec، برنامه /bin/ls را اجرا می‌کند و این برنامه جایگزین برنامه فعلی (پوسته) خواهد شد.

رابط‌ها و پیاده‌سازی‌های مختلفی از exec وجود دارد. بسته به زبان برنامه‌نویسی مورد استفاده، این قابلیت ممکن است توسط یک یا چند تابع در دسترس قرار داشته باشد، و همچنین بسته به سیستم‌عامل مورد استفاده، ممکن است یک یا چند فراخوان سیستمی برای exec موجود باشد. به همین دلیل، گاهی اوقات exec به عنوان *مجموعه‌ای از توابع* تشریح می‌شود، نه یک تابع خاص.

اسامی استاندارد برای چنین توابعی در زبان سی عبارتند از: execl, execle, execlp, execv, execve, و execvp، اما تابعی بخصوص به نام exec وجود ندارد. زبان‌های برنامه‌نویسی سطح بالاتر ممکن است تابعی به نام exec در دسترس قرار دهند.

استاندارد پازیکس در زبان برنامه‌نویسی سی، این توابع را در فایل سرایند unistd.h تعریف کرده‌است. همین توابع در فایل سرایند process.h در سیستم‌عامل‌های داس و ویندوز تعریف شده‌اند.


```c
int execl(char const *path, char const *arg0, ...);
int execle(char const *path, char const *arg0, ..., char const * const *envp);
int execlp(char const *file, char const *arg0, ...);
int execv(char const *path, char const * const * argv);
int execve(char const *path, char const * const *argv, char const * const *envp);
int execvp(char const *file, char const * const *argv);
```


در ابتدای نام همه این توابع عبارت exec به معنی executable وجود دارد. حروف خاصی که در این این توابع وجود دارند به معانی زیر هستند:

:**e** – به معنی environment است. توابعی که در نام خود e دارند، آرایه‌ای حاوی اشاره‌گرهایی به متغیرهای محیطی را به عنوان پارامتر می‌پذیرند. متغیرهای محیطی موجود در این آرایه، به تصویر فرایند جدید ارسال می‌شود.
:**l** – در توابعی که در نام خود l دارند، می‌توان آرگومان‌های خط فرمانی را به صورت جداگانه به برنامه ارسال کرد.
:**p** – در توابعی که در نام خود p دارند، از متغیر محیطی PATH برای پیدا کردن فایلی که توسط آرگومان path مشخص شده، استفاده می‌شود و فایل مورد نظر پس از پیدا شدن در مسیر مناسب، اجرا خواهد شد.
:**v** – در توابعی که در نام خود v دارند، آرگومان‌های خط فرمانی به صورت آرایه‌ای از اشاره‌گرها به تابع ارسال می‌شوند، نه به صورت جداگانه.

; path
این آرگومان فایل اجرایی مورد نظر را مشخص خواهد کرد. این فایل جایگزین تصویر فرایند فعلی خواهد شد. پارامترهای arg0 به بعد، آرگومانهایی هستند که به تصویر فرایند ارسال خواهند شد. argv آرایه‌ای از اشاره‌گرهاست که به عنوان آرگومان برای تصویر فرایند ارسال خواهند شد.

; arg0
آرگومان arg0 باید نام فایل اجرایی را مشخص کند. معمولاً مقدار این آرگومان با مقدار آرگومان path برابر است.

; envp
این پارامتر، آرایه‌ای از اشاره‌گرها به تنظیمات محیطی است. توابعی که در انتهای نام خود حرف e دارند، متغیرهای محیطی اشاره شده توسط این پارامتر را جایگزین متغیرهای محیطی فعلی می‌کنند. این آرگومان، آرایه‌ای از اشاره‌گرهای کاراکتری است. هر عنصر در این آرایه (غیر از عنصر آخر)، به یک رشته اشاره می‌کند که این رشته یک متغیر محیطی را تعریف می‌کند و باید قالبی مانند زیر داشته باشد:

:`name=value`

به‌طوری‌که *name* نام متغیر محیطی مورد نظر است و *value* مقدار آن متغیر محیطی است. آخرین عضو آرایه envp باید NULL باشد.

در توابعی که در انتهای نام خود e ندارند، از متغیرهای محیطی فعلی استفاده خواهند شد، به عبارت دیگر، برنامه‌ای که قرار است اجرا شود، متغیرهای محیطی خود را از برنامهٔ در حال اجرا به ارث خواهد برد.

از آنجا که exec تصویر فرایند فعلی را با برنامه جدید جایگزین می‌کند، در صورت موفقیت‌آمیز بودن، نمی‌تواند مقداری را به برنامه فعلی برگرداند. با این حال، در صورت شکست، مقدار 1- برگردانده خواهد شد و متغیر سراسری errno هم با مقداری مناسب مقداردهی خواهد شد.

## منابع

رده:ابزارهای اس یو اس ۲۰۰۸ یونیکس
رده:پازیکس
رده:فراخوان‌های سیستمی
رده:فرایند (رایانه)
رده:ویکی‌سازی رباتیک
رده:Process.h