Kabuğun İlklendirilmesi
Önceki Bir İş Denetim kabuğunun Gerçeklenmesi Sonraki
Kabuğun İlklendirilmesi
Normalde iş denetimi yapan bir kabuk başlatıldığında, kendi iş denetimini yapan başka bir kabuk tarafından çalıştırılmışsa dikkatli olmak zorundadır.
Etkileşimli olarak çalışan bir altkabuk kendi iş denetimini etkinleştirmeden önce kendini çalıştıran kabuk tarafından önalana mı yerleştirildiğine bakmak zorundadır. getpgrp işlevi ile kendi süreç grup kimliğini öğrenip, bunu kendi denetim uçbiriminin önalan işinin süreç grup kimliği (tcgetpgrp işlevi ile öğrenebilir) ile karşılaştırarak yapar.
Eğer altkabuk bir önalan işi olarak çalışmıyorsa, kendi süreç grubuna bir SIGTTIN sinyali göndererek kendini durdurmalıdır. Kendini keyfi olarak önalana yerleştiremez; bunu kendini çalıştıran kabuğa kullanıcının söylemesini beklemek zorundadır. Eğer alt kabuk yine de devam ederse bu sınamayı tekrarlayıp hala önalanda değilse, kendini tekrar durdurmalıdır.
Bir alt kabuk kendini çalıştıran kabuk tarafından önalana yerliştirildikten sonra kendi iş denetimini etkinleştirebilir. Bunu setpgid işlevini çağırıp kendini, kendi süreç grubuna koyduktan sonra tcsetpgrp çağrısıyla bu süreç grubunu önalana yerleştirerek yapar.
Bir kabuk iş denetimini etkinleştirdiğinde, kendini tüm iş denetimi durdurma sinyallerini yoksaymaya ayarlayıp kazaen kendi kendini durdurma şansını ortadan kaldırmalıdır. Bunu tüm durdurma sinyalllerine eylem olarak SIG_IGN atayarak yapabilirsiniz.
Etklileşimsiz olarak çalışan bir kabuk iş denetimini destekleyemez ve desteklememelidir. Kendi süreç grubunda oluşturulan tüm süreçleri bırakmalıdır; bu onu etkileşimsiz kabuk yapar. Onun alt süreçleri kendini çalıştıran kabuğun tek tek işleri olarak ele alınır. Bunu yapmak kolaydır, iş denetim ilkellerini kullanmamak yeterlidir, ama bunu kabuğa yaptırmayı unutmamalısınız.
Burada bunun örnek kabuğumuz tarafından ilklendirme kodunda nasıl yapıldığı gösterilmiştir.
/* Kabuğun özniteliklerini hatırlayalım.  */

#include <sys/types.h>
#include <termios.h>
#include <unistd.h>

pid_t shell_pgid;
struct termios shell_tmodes;
int shell_terminal;
int shell_is_interactive;


/* Başlamadan önce kabuğun önalan işi olarak etkileşimli
   çalışacağından emin olalım. */

void
init_shell ()
{

  /* Etkileşimli mi çalışıyor acaba.  */
  shell_terminal = STDIN_FILENO;
  shell_is_interactive = isatty (shell_terminal);

  if (shell_is_interactive)
    {
      /* Önalana geçinceye kadar döngüde kalsın.  */
      while (tcgetpgrp (shell_terminal) != (shell_pgid = getpgrp ()))
        kill (- shell_pgid, SIGTTIN);

      /* Etkileşimli ve iş denetimi sinyallarini yoksayalım.  */
      signal (SIGINT, SIG_IGN);
      signal (SIGQUIT, SIG_IGN);
      signal (SIGTSTP, SIG_IGN);
      signal (SIGTTIN, SIG_IGN);
      signal (SIGTTOU, SIG_IGN);
      signal (SIGCHLD, SIG_IGN);

      /* Kendimizi kendi süreç grubumuza koyalım.  */
      shell_pgid = getpid ();
      if (setpgid (shell_pgid, shell_pgid) < 0)
        {
          perror ("Kabuk kendini kendi süreç grubuna yerleştiremedi");
          exit (1);
        }

      /* Uçbirim denetimini ele geçirelim.  */
      tcsetpgrp (shell_terminal, shell_pgid);

      /* Kabuğun öntanımlı uçbirim öznitelikerini saklayalım.  */
      tcgetattr (shell_terminal, &shell_tmodes);
    }
}
Önceki Üst Ana Başlık Sonraki
Kabuk için Veri Yapıları Başlangıç İşlerin Başlatılması
Bir Linux Kitaplığı Sayfası