Süreç Oluşturma Örneği
Önceki XXVI. Oylum - Süreçler Sonraki
Süreç Oluşturma Örneği
Burada yerleşik system işlevine benzer örnek bir yazılım görüyoruz. Kendi komut argümanını sh -c komut 'ın eşdeğerini kullanarak çalıştırır.
#include stddef.h
#include stdlib.h
#include unistd.h
#include sys/types.h
#include sys/wait.h

/* Komutu bu kabuk yazılımını kullanarak çalıştır.  */
#define SHELL "/bin/sh"

int
my_system (const char *komut)
{
  int status;
  pid_t pid;

  pid = fork ();
  if (pid == 0)
    {
      /* Bu alt süreçtir.  Kabuk komutunu çalıştırır. */
      execl (SHELL, SHELL, "-c", komut, NULL);
      _exit (EXIT_FAILURE);
    }
  else if (pid < 0)
    /* Çatallama başarılamadı.  Başarısızlığı bildir.  */
    status = -1;
  else
    /* Bu üst süreçtir.  Bitirmek için alt süreci bekle.  */
    if (waitpid (pid, &status, 0) != pid)
      status = -1;
  return status;
}
Bu örnekte dikkat etmeniz gereken bir kaç nokta var.
Unutmayınız ki yazılıma sağlanan ilk argv argümanı çalıştırılan yazılımın adıdır. Bu nedenle, execl'ye yapılan çağrıda, SHELL bir kere çalıştırılacak yazılım ismini sağlamak için, bir kere de argv[0]'a değer sağlamak için kullanılmıştır.
Alt süreçteki execl çağrısı başarılıysa değer döndürmez. Başarısız olursa, alt sürecin sonlanması için birşeyler yapmanız gerekir. Sadece return ile kötü durum kodu döndürülmesi, orjinal yazılımı çalıştıran iki süreci bırakabilir. Bunun yerine, doğru davranış üst sürece alt süreç ile ilgili başarısızlığın bildirilmesidir.
Bunu başarmak için _exit işlevini çağırın. _exit işlevini exit yerine kullanma nedeni stdout gibi tamamen tamponlanmış akımları boşaltmanın önüne geçmektir. Bu akımların tamponları büyük olasılıkla üst süreçten fork ile kopyalanmış veri içerir, sonunda bu veri üst süreç tarafından çıktı alınır. Alt süreçte exit çağrısı verinin iki kez çıktı vermesine neden olabilir. Bkz Sonlandırmanın İçyapısı.
Önceki Üst Ana Başlık Sonraki
BSD Süreç Bekleme İşlevleri Başlangıç POSIX Evreleri
Bir Linux Kitaplığı Sayfası