Linux getopt ile arguman işlemleri

0
775
gösterim

Merhaba,

Bu yazı getopt@gnu.org adresinden faydalanılarak hazırlanmıştır.

Bir C programı yazarken programı argümanlar ile kontrol etmek isteyebiliriz.Bu çoğu zaman (eğer terminal kullanmayı seviyorsanız) çok kullanışlı bir program oluyor.Bunun için main fonksiyonumuza aldığımız “int argc, char **argv” değişkenlerini kullanmamız gerekiyor.

C Programlamaya yeni başlayanlara main() fonksiyonu değer almaz ve değer döndürmez diye anlatılır genelde.Halbuki main fonksiyonu her ikisini de yapabiliyor.Program ilk çalıştırıldığında terminalden argüman alabiliyor ve programın bitiminde hata kodu veya 0 döndürerek hatalı bitip bitmediğini işletim sistemine bildiriyor.Neyse konumuz bu değil ama yine de değinmek istedim 🙂

Programınızda direk “int argc” değişkeninden kaç tane argümanla çalıştırıldığını ve “char* argv[]” dizisinden bu argümanların neler olduğunu öğrenebilirsiniz.(araya not argv[0] çalıştırılan programın ismidir)

Ben bunu unistd.h kütüphanesinde bulunan getopt ile yapmayı anlatmaya çalışacağım.Getopt linux programlarında ortak olan bir şekilde argüman almanızı sağlıyor.yani “program -a -c 12” veya “program –help” gibi.

getopt (argc, argv, “ac:”)

fonksiyon argüman değişkenlerimizi ve iki tırnak içindeki argüman değerlerimizi alıyor.buradaki tırnak içindeki ifade -a ve -c argümanlarını alacağını “:” ise c argümanının bir değer alması gerektiğini gösteriyor yani “program -c 12” gibi çalıştırmalıyız.bunu istediğiniz harflerle tanımlayabilirsiniz.(ör: “al:hb:c”)

getopt fonksiyonu genel olarak bir while döngüsü içerisinde çağırılıyor.Argümanlar bitene kadar bu döngü devam ediyor.

kütüphanemizde tanımlanmış değişkenlerimiz ise;

char* optarg : bir değer alan argümanın aldığı değeri tutan char* tipindeki değişken.

int optopt : eğer program bilinmeyen bir argüman almışsa yada değer alması gereken bir argüman değer almamışsa.argümanı tutan değişkendir.

int opterr : eğer bu değişken sıfır değilse getopt bir hata mesajı basacaktır.

int optind : bu değişken getopt tarafından bir sonraki argümanın sırasını tutar.

genel olarak getopt nin değişkenleri ve fonksiyonu bu şekildedir.Bunu bir örnek üzerinde incelersek;(bu örnek temel olarak yukarıda verdiğim linkteki örnekten oluşturulmuştur)

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main (int argc, char **argv)
{
  int index;
  int c;

  opterr = 0;
  while ((c = getopt (argc, argv, "hc:")) != -1)
    switch (c)
      {
      case 'h':
        puts("yardım mı almak istiyorsunuz ?");
        break;
      case 'c':
        printf("argümanla birlikte gelen değer : %s",optarg);
        break;
      case '?':
        if (optopt == 'c')
          fprintf (stderr, " %c argümanını bir değerle girmelisiniz\n", optopt);
        else if (isprint (optopt))
          fprintf (stderr, "bilinmeyen argüman %c'.\n", optopt);
        else
          fprintf (stderr,
                   "Bilinmeyen argüman `\\x%x'.\n",
                   optopt);
        return 1;
      default:
        abort ();
      }

  for (index = optind; index < argc; index++)
    printf ("Yanlış bir argüman girdiniz! %s\n", argv[index]);
  return 0;
}