Bir Dosyanın Çalıştırılması
Önceki XXVI. Oylum - Süreçler Sonraki
Bir Dosyanın Çalıştırılması
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.
exec işlevinin etkilerini çağrılan yazılımın bakış açısıyla görmek için, bkz. Temel Yazılım ve Sistem Arayüzü.
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).
Önceki Üst Ana Başlık Sonraki
Bir Sürecin Oluşturulması Başlangıç Süreç Tamamlama
Bir Linux Kitaplığı Sayfası