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.