Süreç Tamamlama
Önceki XXVI. Oylum - Süreçler Sonraki
Süreç Tamamlama
Bu bölümde anlatılan işlevler bir alt sürecin sonlanmasını veya durmasını beklemek ve durumunu algılamak için kullanılırlar. Bu işlevler sys/wait.h başlık dosyası içinde bildirimlidir.
pid_t waitpid
(pid_t pid,
 int  *durum-gstr,
 int   seçenekler)
işlev
waitpid işlevi, süreç kimliği pid olan alt sürecin durum bilgisini istemek için kullanılır. Normalde, çağıran süreç, alt süreç sonlanarak durum bilgisini verene kadar askıda kalır.
pid argümanı için verilecek diğer değerler farklı yorumlanır. -1 veya WAIT_ANY değeri her hangi bir alt süreç için durum bilgisi ister; 0 veya WAIT_MYPGRP değeri çağıran süreçle aynı süreç grubundaki her hangi bir alt süreç için bilgi ister; ve -sgkim gibi başka herhangi bir negatif değer, süreç grup kimliği sgkim olan herhangi bir alt süreç için bilgi ister.
Eğer alt süreç durum bilgisi hemen mevcutsa, bu işlev beklemeden hemen döner. Eğer birden fazla seçilebilir alt sürecin durum bilgisi mevcutsa, rastgele birisi seçilir ve durum bilgisi hemen döndürülür. Diğer seçilebilir alt süreçlerden birinin durum bilgisini almak için, waitpid işlevini tekrar çağırmanız gerekir.
seçenekler argümanı bir bit maskesidir. Değeri sıfır veya daha çok sayıda WNOHANG ve WUNTRACED bayrağının bit bit VEYAlanmış (| işleci) hali olmalıdır. WNOHANG bayrağı üst sürecin beklememesi gerektiğini belirtmek için; ve WUNTRACED bayrağı duran ve hatta sonlanan süreçlerden durum bilgisi istemek için kullanılır.
Alt süreçten alınan durum bilgisi, durum-gstr boş gösterici değilse, durum-gstr 'nin gösterdiği nesnede saklanır.
Bu işlev çok-evreli yazılımlar için iptal noktasıdır. Eğer waitpid çağrıldığında bir evre bazı kaynakları (bellek, dosya tanımlayıcısı, semafor veya her hangi başka bir kaynak) ayırırsa bu sorun olur. Evre iptal edilirse bu kaynaklar yazılım sonlanıncaya kadar ayrılmış durumda kalırlar. Bundan kaçınmak için waitpid'e yapılan çağrılar iptal işleyicileri kullanılarak korunmalıdır.
Dönüş değeri normalde durumu bildirilen alt sürecin süreç kimliğidir. Eğer alt süreçler var ancak hiçbiri uyarım için beklemiyorsa, waitpid birisi uyarılana kadar baskılanır. Fakat, WNOHANG seçeneği belirtildiyse, waitpid baskılanmadan sıfır döndürür.
Eğer waitpid belirli bir süreç kimliği için bekleyecekse, diğer hiçbir alt süreci (varsa) dikkate almaz. Bu nedenle eğer uyarım için bekleyen alt süreçler varsa, fakat beklenmesi için belirtilen süreç kimliğine sahip alt süreç bunlardan biri değilse, waitpid yukarıda açıklandığı gibi ya baskılanır ya da sıfır döndürür.
-1 değeri hata halinde döndürülür. Aşağıdaki errno hata durumları bu işlev için tanımlanmıştır:
EINTR
Çağıran sürece bir sinyal gelmesi nedeniyle işlev kesintiye uğradı. Bkz Sinyallerle Kesilen İlkeller.
ECHILD
Bekleyen alt süreç yok veya belirtilen pid çağıran sürecin bir alt süreci değil.
EINVAL
seçenekler argümanı için geçersiz bir değer verildi.
Bu sembolik sabitler waitpid işlevinin pid argümanının değerleri olarak tanımlanmıştır.
WAIT_ANY
Bu sabit makro (değeri -1dir) waitpid'nin herhangi bir alt sürecin durum bilgisini döndürmesi için belirtilirr.
WAIT_MYPGRP
Bu sabit (0 değerli) waitpid'in çağıran süreçle aynı süreç grubundaki herhangi bir alt sürecin durum bilgisini döndürmesi için belirtilir.
Bu sembolik sabitler waitpid işlevinin seçenekler argümanı için bayrak olarak tanımlanmıştır. Bayrakları bit bit VEYAlayarak argümana değer olarak kullanabilirsiniz.
WNOHANG
Bu bayrak, eğer uyarım için bekleyen alt süreç yoksa, waitpid işlevinin beklemeden hemen dönmesi gerektiğini belirtir.
WUNTRACED
Bu bayrak, waitpid işlevinin durmuş veya sonlandırılmış alt süreçlerinin durumlarını bildirmesini belirtir.
pid_t wait
(int  *durum-gstr)
işlev
Bu waitpid'in basitleştirilmiş halidir ve herhangi bir alt süreç sonlanıncaya kadar beklemek için kullanılır. Aşağıdaki çağrı şekli:
wait (status)
aşağıdaki ile tamamen aynıdır:
waitpid (-1, status, 0)
Bu işlev çok-evreli yazılımlar için iptal noktasıdır. Eğer wait çağrıldığında bir evre bazı kaynakları (bellek, dosya tanımlayıcısı, semafor veya her hangi başka bir kaynak) ayırırsa bu sorun olur. Evre iptal edilirse bu kaynaklar yazılım sonlanıncaya kadar ayrılmış durumda kalırlar. Bundan kaçınmak için wait'e yapılan çağrılar iptal işleyicileri kullanılarak korunmalıdır.
pid_t wait4
(pid_t          pid,
 int           *durum-gstr,
 int            seçenekler,
 struct rusage *kullanım)
işlev
Eğer kullanım bir boş gösterici ise, wait4 işlevi waitpid (pid, durum-gstr, seçenekler) ile eşdeğerdir.
Eğer kullanım bir boş gösterici değilse, wait4 işlevi *kullanım içinde alt sürecin kullanım şekillerini saklar (alt süreç durduysa değil, yalnızca sonlandıysa). Bkz. Özkaynak Kullanımı.
Bu işlev bir BSD oluşumudur.
Burada sonlandırılmış bütün alt süreçlerin durumunu beklemeden almak için waitpid işlevinin kullanımını gösteren bir örnek görüyoruz. Bu işlev, en azından bir alt sürecin sonlandırılması gerektiğini belirten bir sinyal olan, SIGCHLD için bir işleyici olarak tasarlanmıştır.
void
sigchld_handler (int signum)
{
  int pid, status, serrno;
  serrno = errno;
  while (1)
    {
      pid = waitpid (WAIT_ANY, &status, WNOHANG);
      if (pid < 0)
        {
          perror ("waitpid");
          break;
        }
      if (pid == 0)
        break;
      notice_termination (pid, status);
    }
  errno = serrno;
}
     
Önceki Üst Ana Başlık Sonraki
Bir Dosyanın Çalıştırılması Başlangıç Süreç Tamamlanma Durumu
Bir Linux Kitaplığı Sayfası