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ı.