Komut Satırı Argümanları ve Çevre Değişkenleri
Bir program çalıştırılırken program isminin yanına yazılan yazılara komut satırı argümanları
denir. İşletim sistemi komut satırı argümanlarını yaratılan process’in bellek alanına taşır.
Örneğin DOS’ta komut satırı argümanları PSP’nin 128’inci byte’ından itibaren komut
satırındaki haliyle yerleştirilir. Genellikle işletim sistemlerinde komut satırı argümanları
C’deki argv’de olduğu gibi geçirilmez. C’deki main fonksiyonuna geçirilen argv
derleyicilerin giriş kodu tarafından düzenlenmektedir. Tipik olarak derleyicilerin giriş kodu
komut satırı argümanlarını işletim sisteminin yerleştirdiği adresten alarak her argümanın
sonuna NULL karakter yerleştirmek suretiyle başka bir alana taşırlar, NULL karakterlerle
ayrılmış yazıların başlangıç adreslerini bir gösterici dizisine yerleştirirler. Bu gösterici
dizisinin adresini de argv olarak main fonksiyonuna geçirirler.
Örneğin
C:\study> den ali veli¿
işlemiyle derleyicinin giriş kodu argv değerini aşağıdaki gibi bir düzenleme ile bulunur.
C ve C++ standartlarına göre main fonksiyonunun parametrik yapısı aşağıdakilerden biri
olmak zorundadır:
int main(void);
int main(int argc, char *argv[]);
Görüldüğü gibi aslında main fonksiyonunun geri dönüş değeri standartlara göre void
olmamalıdır. Ancak void olmasında yaygın derleyicilerin hiçbirisi için bir sakınca yoktur.
Zaten bu derleyicilerin kendi örneklerinde bile main fonksiyonunun geri dönüş değerinin void
alındığı görülmektedir. main fonksiyonunun geri dönüş değeri void alındığında derleyicilerin
uyarı vermemesi için belirli bir değer ile geri dönülmesi gerekir. Ayrıca argv[argc]’nin NULL
gösterici olması da garanti edilmiştir.
NULL
arg
v
C:\study\den.exe\0ali\0veli\0
Anahtar Notlar: C’de NULL karakter ‘\0’ ile temsil edilir. Hangi karakter tablosu kullanılırsa
kullanılsın, sayısal değerinin sıfır olması garanti edilmiştir. Ancak NULL gösterici
standartlara göre sıfır adresi olmak zorunda değildir. Standartlara göre NULL gösterici
değeri stdio.h dosyası içerisinde NULL sembolik sabiti ile define edilmelidir. Bu durumda
NULL sembolik sabiti güvenli olarak NULL gösterici olarak kullanılabilir. Pek çok
derleyicide NULL sembolik sabiti
#define NULL ((void *) 0)
biçiminde ifade edilmiştir. Yine standartlara göre NULL gösterici türünden sabit oluşturmak
için yalnızca 0 ya da ((void *) 0) kullanılabilir. Bir göstericiye düz bir 0 atamak, ona NULL
gösterici atamak anlamına gelir, eğer NULL gösterici değeri 0’ın dışında bir değerse
derleyici göstericiye o değeri atamak zorundadır. Yani aslında NULL göstericinin adres
değeri 0’ın dışında olabilmektedir, ama programda 0 olarak kabul edilmektedir. C
standartlarına göre
if (p) {
//...
}
gibi bir karşılaştırma p’nin içinde NULL gösterici olup olmadığını anlamak için
taşınabilirdir. Ancak NULL göstericinin 0 dışında bir değere sahip olabilmesi standartlarda
esneklik amacı ile düşünülmüştür. Yaygın bütün derleyicilerde NULL gösterici 0 değeridir.
Aşağıdaki işlemlerin hepsi standartlara göre taşınabilirdir.
if (p != NULL) {
}
if (p != 0) {
}
if (p != (void *) 0) {
}
Çevre değişkenleri belirli bir değişken ismi ile bir yazıyı eşleştiren bir mekanizma oluşturur.
Aslında çevre değişkenleri process’lerin handle alanlarında saklanır. Yani process’e özgü bir
bilgidir. Process’in çevre değişkenleri UNIX/Linux sistemlerinde fork ve exec işlemi
sırasında yeni yaratılan process’e aktarılmaktadır. Örneğin shell üzerinden bir program
çalıştırıldığında shell programının çevre değişkenleri çalıştırılan programa geçer. En ünlü
çevre değişkeni path değişkenidir. UNIX/Linux shell programlarında shell üzerinde env
komutu ile shell’e ilişkin çevre değişkenleri görülebilir. DOS’ta env komutu yerine set
komutu kullanılmaktadır. Shell üzerinde belirli bir çevre değişkeninin değerini görmek için
echo $<çevre_değişkeni_ismi>
yapılır. Aynı işlem DOS’ta
set <çevre_değişkeni>
biçiminde kullanılır. Programcı çevre değişkenlerinden çeşitli biçimlerde faydalanabilir. En
yaygın durum belirli bir dosyanın belirli bir dizinde arandığı durumlardır. Programcı belli bir
çevre değişkeninin değerine bakar ve dosyayı orada arar. Örneğin DOS’ta çalışan C
derleyicilerinin hemen hepsi default include dizinini tespit edebilmek için çevre değişkenleri
kullanırlar.
getenv Fonksiyonu
Bu fonksiyon standart bir C fonksiyonudur, belirli bir çevre değişkeninin değerini almak için
kullanılır.
char *getenv(const char *name);
Fonksiyon parametre olarak çevre değişkeninin ismini alır, geri dönüş değeri olarak çevre
değişkeninin değerinin bulunduğu static alanın adresini verir. Eğer ilgili çevre değişkeni
tanımlanmamışsa fonksiyon NULL değeri ile geri döner. Fonksiyonun prototipi stdlib.h
içerisindedir. UNIX/Linux sistemlerinde çevre değişkenlerinin büyük harf, küçük harf
duyarlılığı vardır, DOS’ta yoktur. UNIX/Linux sistemlerinde PATH çevre değişkeninin
içeriği dizin1:dizin2:dizin3... biçiminde, DOS ve Windows sistemlerinde
dizin1;dizin2;dizin3... biçimindedir.
/* enviroment.c */
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *p;
p = getenv("PATH");
if (p == NULL) {
fprintf(stderr, "Böyle bir değişken yok\n");
exit(1);
}
puts(p);
}
UNIX/Linux sistemlerinde standart bazı çevre değişkenleri vardır. Örneğin HOME
kullanıcının dizinini, USER kullanıcı ismini belirtmektedir. Belirli bir çevre değişkeninin
değerini değiştirmek ya da yeni bir çevre değişkeni eklemek için C standartlarında ve POSIX
standartlarında bir fonksiyon yoktur. Ancak putenv isimli fonksiyon popüler UNIX ve
Linux sistemlerinde desteklenmektedir.
putenv Fonksiyonu
Bu fonksiyon belirli bir çevre değişkenini eklemek için ya da değerini değiştirmek için
kullanılır.
int putenv(const char *name);
Fonksiyon parametre olarak “isim=değer” yazısını alır. Başarılı ise 0 değerine, başarılı
değilse 0 dışı bir değere geri döner.