Bu bölüm bir dosyayı bir süreç görüntüsü olarak çalıştırmak için kullanılan
exec ailesi işlevlerini anlatmaktadır. Bu işlevler bir alt sürecin çatallandıktan sonra yeni bir yazılımı çalıştırmasını sağlamak için kullanılabilir.
Bu ailedeki işlevler argümanlarının belirtiliş şekillerine göre farklılıklar gösterir,
aksi takdirde hepsi aynı işi yapar. Bunlar
unistd.h başlık dosyası içinde bildirimlidir.
int execv | (const char *dosyaismi,
char *const argv[]) |
işlev
execvişlevi dosyaismi adındaki dosyayı yeni bir süreç görüntüsü olarak çalıştırır.
argv argümanı boş karakter sonlandırmalı dizgelerden oluşan bir dizidir ve bu çalıştırılan yazılımın
main işlevinin
argv argümanına değer sağlamak için kullanılır.
Bu dizinin son elemanı bir boş gösterici olmalıdır. Kural olarak, bu dizinin ilk elemanı yazılımın dosya ismidir (dizinsiz hali). Yazılımların bu argümanlara nasıl eriştiğini bütün ayrıntılarıyla incelemek için, bkz.
Yazılım Argümanları,
Yeni süreç görüntüsünün ortamı geçerli süreç görüntüsünün
environ değişkeninden alınır; ortam değişkenleri hakkında bilgi için
Ortam Değişkenleri bölümüne bakınız.
int execl | (const char *dosyaismi,
const char *arg0,
…) |
işlev
Bu da execv gibidir, fakat argv dizgeleri bir dizi yerine tek tek belirtilir. Son argüman bir boş gösterici olmalıdır.
int execve | (const char *dosyaismi,
char *const argv[],
char *const ortam[]) |
işlev
Bu da
execv gibidir, fakat yeni yazılım için ortamı açıkça belirtmenize
ortam argümanıyla izin verir. Bu
environ değişkeniyle aynı biçimde, dizgelerden oluşan bir dizi olmalıdır; bkz.
Ortama Erişim.
int execle | (const char *dosyaismi,
const char *arg0,
char *const ortam[],
…) |
işlev
Bu da execl gibidir, fakat yeni yazılım için ortamı açıkça belirtmenize izin verir. ortam argümanı son argv argümanını olan boş göstericiden sonra gelmeli ve environ değişkeniyle aynı biçimde, dizgelerden oluşan bir dizi olmalıdır.
int execvp | (const char *dosyaismi,
char *const argv[]) |
işlev
execvp işlevi
execv gibidir, ancak eğer
dosyaismi bir
/ içermiyorsa
dosyaismi isimli dosyanın tam ismini bulmak için
PATH ortam değişkeninde (
Standart Ortam Değişkenleri) listelenen dizinleri de arar.
Bu işlev sisteme yardımcı yazılımların çalıştırılmasında kullanışlı olabilir, çünkü bu yazılımları bulmak için kullanıcının seçtiği yerlere bakar. Kabuklar bunu kullanıcının yazdığı komutları çalıştırmak için kullanırlar.
int execlp | (const char *dosyaismi,
const char *arg0,
…) |
işlev
Bu işlev execl gibidir, ancak execvp işlevi gibi dosya ismi arama işlemi uygular.
Argüman listesinin ve ortam değişkenleri listesinin toplam boyutu
ARG_MAX bayttan büyük olmamalıdır. Bkz.
Genel Sınırlar. GNU sisteminde, her dizge için bu boyut (
ARG_MAX ile karşılaştırıldığında), "dizge içerisindeki karakter sayısı, artı
char * türünün boyutu, artı bir" değerinin
char * boyutunun katlarına yuvarlanması ile elde edilir. Diğer sistemler biraz farklı sayım kuralları uygulayabilir.
Bu işlevler normalde değer döndürmezler, çünkü yeni bir yazılımın çalıştırılması halen çalışan yazılımın tamamen terk edilmesine neden olur. Hata durumunda
-1 döndürülür. Olağan
dosya ismi hatalarına ek olarak, aşağıdaki
errno hata durumları bu işlevler için tanımlanmıştır:
- E2BIG
Yeni yazılımın argüman listesinin uzunluğuyla ortam değişkenleri listesinin birleştirilmiş büyüklüğü ARG_MAX bayttan büyüktür. GNU sisteminde argüman listesi büyüklüğü için belirtilmiş bir sınır yoktur, böylece bu hata kodu oluşamaz, ancak eğer argümanlar kullanılabilir bellek için çok büyük ise bunun yerine ENOMEM alabilirsiniz.
- ENOEXEC
Belirtilen dosya doğru biçimde olmadığı için çalıştırılamamaktadır.
- ENOMEM
Belirtilen dosyanın çalıştırılması mevcut olandan daha fazla depolama alanı gerektirmektedir.
Yeni dosyanın çalıştırılması başarılı olursa, okumada olduğu gibi dosyanın erişim zamanı alanını günceller. Dosyaların erişim zamanları hakkında daha fazla bilgi için
Dosya Zamanları bölümüne bakınız.
Dosyanın tekrar kapandığı nokta belirtilmemiştir, ancak süreçten çıkmadan önceki bir nokta veya başka bir süreç görüntüsü çalıştırılmadan önceki nokta belirtilmiş olabilir.
Yeni bir süreç görüntüsünün çalıştırılması, sadece argüman ve ortam dizgelerini yeni yerlerine kopyalayarak bellek içeriğini tamamen değiştirir. Fakat sürecin diğer bir çok özelliği değişmez:
Eğer süreç görüntü dosyasının set-user-ID ve set-group-ID kip bitleri işaretlenmişse, bu sürecin etkin kullanıcı kimliği ve grup kimliği (sırasıyla) değerlerini etkiler. Bu kavramlara ayrıntılı bir şekilde
Bir Sürecin Aidiyeti içinde değinilmiştir.
Geçerli süreçte görmezden gelinecek sinyaller yeni süreçte de dikkate alınmayacak şekilde ayarlanmalıdır. Diğer bütün sinyaller yeni süreç görüntüsünde öntanımlı hareketlerine ayarlanırlar. Sinyaller hakkında daha fazla bilgi için, bkz.
Sinyal İşleme.
Varolan süreç görüntüsünde açık kalan dosya tanımlayıcıları yeni süreç görüntüsünde de
FD_CLOEXEC (close-on-exec) bayrak kümesine sahip değillerse açık kalırlar. Açık kalan dosyalar varolan süreç görüntüsünden açık dosya tanımlayıcısının dosya kilitleri dahil bütün özelliklerini miras alırlar. dosya tanımlayıcıları
Düşük Seviyeli Girdi ve Çıktı içinde incelenmiştir.
Akımlar, buna karşın,
exec işlevleriyle varlıklarını sürdüremezler, çünkü bunlar sürecin kendi bellek alanına yerleşmektedirler. Yeni süreç görüntüsünün kendisinin yeniden oluşturdukları dışında akımları yoktur.
exec öncesi süreç görüntüsünün içindeki akımların her birinin içinde bir tanımlayıcı vardır ve bunlar
exec ile varlıklarını sürdürürler (
FD_CLOEXEC kümesinin olmaması halinde). Yeni süreç görüntüsü bu yeni akımlara
fdopen kullanarak tekrar bağlanabilir (bkz.
Tanıtıcılar ve Akımlar).