Bir Alt Sürece Boru Hattı
Önceki XV. Oylum - Borular ve FIFOlar Sonraki
Bir Alt Sürece Boru Hattı
Boruların genel kullanım şekli alt süreç olarak çalışan bir yazılım ile veri alışverişidir. Bunu yapmanın bir yolu pipe (boru oluşturmak için), fork (alt süreç oluşturmak için), dup2 (bir alt süreci bir boruyu standart girdi veya çıktı kanalı olarak kullanmaya zorlamak için) ve exec (yeni bir yazılımı çalıştırmak için) birleşimini kullanmaktır. Ya da, popen ve pclose işlevlerini kullanabilirsiniz..
popen ve pclose kullanmanın yararı arayüzünün daha basit ve kullanımının kolay oluşudur. Ancak düşük seviyeli işlevleri doğrudan kullanma esnekliği yoktur.
FILE *popen
(const char *komut,
 const char *kip)
işlev
popen işlevi system işlevleriyle yakından ilgilidir; bkz. Bir Komutun Çalıştırması. komut kabuk komutunu alt süreç olarak çalıştırır. Fakat, komutun bitmesini beklemek yerine, bir alt süreç borusu oluşturur ve boruyla ilişkili bir akım döndürür.
Eğer kip argümanı için "r" belirtirseniz, alt sürecin standart çıktı kanalındaki veriyi almak için akımdan okuma yapabilirsiniz. Alt süreç, standart girdi kanalının özelliklerini üst süreçten (miras) alır.
Benzer bir şekilde, kip argümanı için "w" belirtirseniz, alt sürecin standart girdi kanalına veri göndermek için akıma yazabilirsiniz. Alt süreç, standart çıktı kanalının özelliklerini üst süreçten alır.
Hata durumunda popen boş gösterici ile döner. Bu boru veya akım oluturulamadığında veya yazılım çalıştırılamadığında olabilir.
int pclose
(FILE *akım)
işlev
pclose işlevi popen tarafından oluşturulan akımı kapatmak için kullanılır. system işlevinin yaptığı gibi, alt sürecin bitmesi için bekler ve onun durum değerini döndürür.
Burada popen ve pclose işlevlerinin, çıktının more sayfalama yazılımı gibi başka bir yazılımla filtrelenmesi için nasıl kullanıldığını gösteren bir örnek görüyoruz.
#include <stdio.h>
#include <stdlib.h>

void
write_data (FILE * akim)
{
  int i;
  for (i = 0; i < 100; i++)
    fprintf (akim, "%d\n", i);
  if (ferror (akim))
    {
      fprintf (stderr, "Akıma yazılamadı.\n");
      exit (EXIT_FAILURE);
    }
}

int
main (void)
{
  FILE *cikti;

  cikti = popen ("more", "w");
  if (!cikti)
    {
      fprintf (stderr,
                "ya parametre yanlis ya da dosya sayisi fazla.\n");
      return EXIT_FAILURE;
    }
  write_data (cikti);
  if (pclose (cikti) != 0)
    {
      fprintf (stderr,
                "Artik calistirilamiyor veya baska bir hata var.\n");
    }
  return EXIT_SUCCESS;
}
Önceki Üst Ana Başlık Sonraki
Bir Borunun Oluşturulması Başlangıç FIFO Özel Dosyaları
Bir Linux Kitaplığı Sayfası