Bir Borunun Oluşturulması
Önceki XV. Oylum - Borular ve FIFOlar Sonraki
Bir Borunun Oluşturulması
Boru oluşturmak için en ilkel işlev pipe işlevidir. Bu borunun okuma ve yazma uçlarının her ikisini de oluşturur. Tek bir sürecin kendisiyle konuşması için boru kullanımı pek kullanışlı değildir. Tipik kullanım şekli, bir işlemin bir veya daha fazla alt süreci oluşturmadan önce boruyu oluşturmasıdır. Bundan sonra boru üst ve alt süreç arasında veya iki alt süreç arasında haberleşme için kullanılır.
pipe işlevi unistd.h başlık dosyası içinde tanımlıdır.
int pipe
(int dosyatnm[2])
işlev
pipe işlevi boruyu oluşturur ve borunun okuma ve yazma uçları için dosya tanımlayıcıları (sırasıyla) dosyatnm[0] ve dosyatnm[1] içine koyar.
Girdi ucunun önce geldiğini hatırlamanın kolay bir yolu dosya tanımlayıcı 0'ın standart girdi ve dosya tanımlayıcı 1'in standart çıktı olmasıdır.
Başarı halinde pipe, 0 değerini döndürür. Başarısızlık halinde ise -1 döndürülür. Aşağıdaki errno hata durumları bu işlev için tanımlanmıştır:
EMFILE
Sürecin çok sayıda açık dosyası var.
ENFILE
Sistemde çok sayıda açık dosya var. ENFILE hakkında daha fazla bilgi için Hata Kodları bölümüne bakınız. Bu hata GNU sisteminde hiçbir zaman oluşmaz.
Burada basit bir boru oluşturma yazılımı görüyoruz. Bu yazılım fork işlevini (Bir Sürecin Oluşturulması) alt süreç oluşturmak için kullanmıştır. Üst süreç veriyi boruya yazar, alt süreç okur.
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

/* Borudan karakterleri oku ve stdout'a yaz. */

void
read_from_pipe (int dosya)
{
  FILE *akim;
  int c;
  akim = fdopen (dosya, "r");
  while ((c = fgetc (akim)) != EOF)
    putchar (c);
  fclose (akim);
}

/* Boruya rastgele birşeyler yaz. */

void
write_to_pipe (int dosya)
{
  FILE *akim;
  akim = fdopen (dosya, "w");
  fprintf (akim, "Merhaba!\n");
  fprintf (akim, "Elveda!\n");
  fclose (akim);
}

int
main (void)
{
  pid_t pid;
  int boru[2];

  /* Boruyu yarat. */
  if (pipe (boru))
    {
      fprintf (stderr, "Boruda hata oluştu.\n");
      return EXIT_FAILURE;
    }

  /* Alt süreci oluşturalım. */
  pid = fork ();
  if (pid == (pid_t) 0)
    {
      /* Bu bir alt süreç.
         Önce diğer ucu kapatalım. */
      close (boru[1]);
      read_from_pipe (boru[0]);
      return EXIT_SUCCESS;
    }
  else if (pid < (pid_t) 0)
    {
      /* Alt süreç oluşturulamadı. */
      fprintf (stderr, "Alt süreç oluşturulamadı.\n");
      return EXIT_FAILURE;
    }
  else
    {
      /* Bu bir üst süreç.
         Önce diğer ucu kapatalım. */
      close (boru[0]);
      write_to_pipe (boru[1]);
      return EXIT_SUCCESS;
    }
}
Önceki Üst Ana Başlık Sonraki
XV. Oylum - Borular ve FIFOlar Başlangıç Bir Alt Sürece Boru Hattı
Bir Linux Kitaplığı Sayfası