Önalan ve Artalan
Önceki Bir İş Denetim kabuğunun Gerçeklenmesi Sonraki
Önalan ve Artalan
Kabuk tarafından bir iş önalanda başlatılırken kabuk tarafından hangi eylemlerin ele alınması gerektiğine ve bunun bir artalan işi başlatmaktan ne gibi farkları olduğuna bakalım.
Bir önalan işi başlatılırken, ilk olarak kabuk bir tcsetpgrp çağrısı yaparak ona denetim uçbiriminde erişim vermelidir. Bundan sonra, kabuk bu süreç grubundaki sürecin sonlanmasını ya da durmasını beklemelidir. Bu ayrıntılı olarak İşlerin Durdurulması ve Sonlandırılması bölümünde anlatılmıştır.
Gruptaki tüm süreçler tamamlandığında ya da durduğunda, kabuk tekrar bir tcsetpgrp çağrısı yaparak kendi süreç grubu için uçbirim denetimini geri kazanmalıdır. Süreç grubuna, bir artalan işindeki G/Ç işleminden ya da kullanıcı tarafından tuşlanan bir SUSP karakterinden dolayı oluşan durdurma sinyalleri gönderildiğinde normal olarak işteki tüm süreçler durdurulur.
Önalan işi tuhaf bir durumda uçbirimde kalabilir, bu durumda kabuk devam etmeden önce kendi uçbirim kiplerini eski haline getirmelidir. İşin sadece durmuş olması durumunda, iş daha sonra devam edebileceğinden, kabuk önce o anki uçbirim kiplerini kaydetmelidir. Uçbirim kipleri ile ilgili işlemler için kullanılan tcgetattr ve tcsetattr işlevleri Uçbirim Kipleri bölümünde anlatılmıştır.
Bunların hepsini yapan örnek kabuk işlevi:
/* j işini önalana koyalım. cont sıfırdan farklıysa,
   kayıtlı uçbirim kiplerini yerine koyalım ve
   biz engellemeden önce sürecin devam edebilmesi için
   süreç grubuna bir SIGCONT sinyali gönderelim.  */

void
put_job_in_foreground (job *j, int cont)
{
  /* İşi önalana koyalım.  */
  tcsetpgrp (shell_terminal, j->pgid);

  /* Gerekliyse, işe bir devamet sinyali gönderelim.  */
  if (cont)
    {
      tcsetattr (shell_terminal, TCSADRAIN, &j->tmodes);
      if (kill (- j->pgid, SIGCONT) < 0)
        perror ("kill (SIGCONT)");
    }

  /* Rapor vermesini bekleyelim.  */
  wait_for_job (j);

  /* Kabuğu tekrar önalana koyalım.  */
  tcsetpgrp (shell_terminal, shell_pgid);

  /* Kabuğa uçbirim kiplerini geri verelim.  */
  tcgetattr (shell_terminal, &j->tmodes);
  tcsetattr (shell_terminal, TCSADRAIN, &shell_tmodes);
}
Eğer süreç grubu bir artalan işi olarak başlatılıyorsa, kabuğun kendisi önalanda kalmalı ve uçbirimden komutları okumaya devam etmelidir.
Örnek kabukta, bir işi artalana koymak için çok fazla bir şey yapmak gerekmemiştir. Bu işlem için kullanılan işlev:
/* Bir işi artalana koyacağız. cont doğru ise,
   süreç grubuna devam etmesi için bir
   SIGCONT sinyali gönderelim.  */

void
put_job_in_background (job *j, int cont)
{
  /* Gerekliyse artalan işine bir devamet sinyali gönderelim.  */
  if (cont)
    if (kill (-j->pgid, SIGCONT) < 0)
      perror ("kill (SIGCONT)");
}
Önceki Üst Ana Başlık Sonraki
İşlerin Başlatılması Başlangıç İşlerin Durdurulması ve Sonlandırılması
Bir Linux Kitaplığı Sayfası