Kabuk için Veri Yapıları
Önceki Bir İş Denetim kabuğunun Gerçeklenmesi Sonraki
Kabuk için Veri Yapıları
Bu kısımdaki yazılım örneklerinin hepsi basit bir kabuk yazılımının parçalarıdır. Bu bölümdeki veri yapıları ve işlevler örnekte kullanmak içindir.
Örnek kabukta başlıca iki veri yapısı bulunur. job türü, birbirine borularla bağlanan altsüreçlerden oluşan bir iş ile ilgili bilgileri içerir. process türü ise, tek bir altsüreç hakkında bilgi içerir. Bu veri yapılarının bildirimleri:
/* process yapısı tek bir süreçle ilgilidir.  */
typedef struct process
{
  struct process *next;       /* boruhattındaki sonraki süreç */
  char **argv;                /* exec için */
  pid_t pid;                  /* süreç kimliği */
  char completed;             /* süreç tamamlanmışsa doğru */
  char stopped;               /* süreç durmuşsa doğru */
  int status;                 /* raporlanan durum değeri */
} process;

/* job yapısı boruhattıyla bağlı süreçlerden oluşur.  */
typedef struct job
{
  struct job *next;           /* sonraki etkin iş */
  char *command;              /* komut satırı, iletiler için */
  process *first_process;     /* bu işteki süreçlerin listesi */
  pid_t pgid;                 /* süreç grubu kimliği */
  char notified;              /* duran iş için kullanıcıya uyarı varsa doğru */
  struct termios tmodes;      /* kayıtlı uçbirim kipleri */
  int stdin, stdout, stderr;  /* standart g/ç kanalları */
} job;

/* Etkin iş bir listeyle ilintilenir.  Bu onun başıdır.   */
job *first_job = NULL;
job nesneleri üzerinde işlem yapan bazı işlevler:
/* pgid ile belirtilen etkin işi bul.  */
job *
find_job (pid_t pgid)
{
  job *j;

  for (j = first_job; j; j = j->next)
    if (j->pgid == pgid)
      return j;
  return NULL;
}

/* İşteki tüm süreçler durmuş ya da tamamlanmışsa "doğru" ile dön.  */
int
job_is_stopped (job *j)
{
  process *p;

  for (p = j->first_process; p; p = p->next)
    if (!p->completed && !p->stopped)
      return 0;
  return 1;
}

/* İşteki tüm süreçler tamamlanmışsa "doğru" ile dön.  */
int
job_is_completed (job *j)
{
  process *p;

  for (p = j->first_process; p; p = p->next)
    if (!p->completed)
      return 0;
  return 1;
}
Önceki Üst Ana Başlık Sonraki
Bir İş Denetim kabuğunun Gerçeklenmesi Başlangıç Kabuğun İlklendirilmesi
Bir Linux Kitaplığı Sayfası