exec
- C kursu
- İleri seviye
- Ders 8/83
- 5 dk
exec ailesi ile süreç değiştirmeyi öğrenirsin.
exec ailesi
exec ailesi, sürecin belleğini yeni bir programla değiştirir. Süreç numarası aynı kalır ama kod, veri ve yığın yenisiyle değiştirilir. exec başarılı olursa geri dönmez.
Yaygın üyeler: execl, execv, execlp, execvp. execvp PATH değişkeninde arama yapar; komut adını vermen yeter. Örneğin execvp("echo", args) süreci echo programıyla değiştirir. Başarısızlıkta -1 döner.
exec neden fork ile?
exec süreci değiştirdiği için tek başına çağırırsan özgün programın devamı kaybolur. Bu yüzden genelde fork ile çocuk oluşturup, çocukta exec çağırırsın; ebeveyn ise kendi işine devam eder.
Bu fork-exec deseni UNIX'te program çalıştırmanın standart yoludur. Kabuklar her komut için bunu yapar: fork → çocuk exec → ebeveyn wait. Böylece kabuk çalışmaya devam ederken çocuk komutu yürütür.
Uygulama execvp ile echo çalıştır
char *args[] = {"echo", "merhaba", NULL}; dizisini tanımla. execvp("echo", args); ile süreci echo programıyla değiştir. Başarısızlık için printf("exec başarısız\n"); yaz.
Başlangıç kodu
#include <stdio.h>
#include <unistd.h>
// args dizisini tanımla
// execvp çağır
// hata durumunu yazdır
int main(void) {
return 0;
}Örnek çözüm
#include <stdio.h>
#include <unistd.h>
int main(void) {
char *args[] = {"echo", "merhaba", NULL};
execvp("echo", args);
printf("exec başarısız\n");
return 1;
}Beklenen çıktı
merhaba
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 exec üyelerini eşle
| Kavram | Anlamı |
|---|---|
execl |
Liste biçimi |
execv |
Dizi biçimi |
execlp |
PATH aramalı liste |
execvp |
PATH aramalı dizi |
2 execvp başarılı olursa ne olur?
- Süreç sonlanır
- Yeni süreç oluşur
- PID değişir
- Sürecin programı değişir Doğru cevap
Açıklama: exec sürecin programını değiştirir; PID aynı kalır.
3 args dizisi
char *args[] = {"echo", "merhaba", ____};
char *args[] = {"echo", "merhaba", NULL};
Açıklama: args dizisi NULL ile bitmeli.