Her sürecin kendi ortam değişkenleri kümesine sahip olduğunu anlamak önemlidir.
Bir süreç çağırdığında fork()
sistem çağrısı, ikinci süreç ( çocuk ilk (özdeş) ebeveyn (bu oluşturulur) kopya Eğer yığınlarının nasıl düşündüklerini bağlı hemen altında sadece bacanın üzerinde bulunduğu (ya da çevreyi içerir :-)
- ancak unix / linux yığın büyür aşağı ) yüksek adresleri.
Genellikle, alt süreç daha sonra execve()
(sanal) hafızasındaki her şeyi ortadan kaldıracak ve belirtilen ikili dosyadaki kod ve veri bölümlerinden yeniden oluşturacak olan sistem çağrısını çağırır .
Bununla birlikte, yığını yeniden yapılandırdığında , işlevi execve()
çağırmadan önce çevreye ve argüman dizgilerini yığına (bu sırayla) önce kopyalar, main()
işlevi çağırmadan önce (işlerin çoğu crt0
bootstrap kodunda execve()
döndürmeden sonra ( girişe) yapılır. İkilikte belirtilen nokta )).
execve()
C kütüphanesinde sistem çağrısı için mevcut ortamı geçecek olan (yani ebeveyn ortamının bir kopyası), arayanı yerine (yani çocuğun ebeveyn çevresini miras alacağı) geçecek sarmalayıcılar vardır - bkz environ(7)
.
Komutu çalıştırmayı (kök olarak) deneyin ps axeww | less
... bu size tüm işlemler için ortamı gösterecektir ! İlginç olanı, işlem kimliği 1'dir (yani init
işlem - önyükleme sırasında çekirdek tarafından oluşturulan ilk işlem).
Belirli bir işlem için çevreye bakmak istiyorsanız (ve bunun işlem kimliğini biliyorsanız), komutu çalıştırmayı deneyin cat /proc/<PID>/environ
( <PID>
işlem kimliği ile değiştirmeyi deneyin ).
Bir işlemin yeterli ayrıcalıkları varsa, kendi yığınını yeniden yazabileceğini ve bu sayede ortamının ne olduğunu öğrenmeyi zorlaştırabilir - ps çıktısında bunun gibi bazı daemon işlemleri göreceksiniz.
Sadece (Builtin) komutunu kullanın kabuk sürecinde belirli ortam değişkeninin geçerli değeri bakmak istiyorsanız Ama sonunda, bütün bu gözleme, @chaos yukarıda söylediklerini aşağı kaynar echo "$<NAME>"
değiştirilmesi ( <NAME>
adıyla ilgilendiğiniz ortam değişkeni) ... aynı değişkenin başka bir işlemde farklı bir değere sahip olabileceğini veya hiç bulunmayabileceğini unutmayın.
echo
değişkenin içeriğini dönüştürebildiği için komutun zayıf bir seçimidir. Aynı zamanda kabuk parametresinin içeriğini de çıkarır. Yani Bourne kabuğu kullanıyorsanız mutlaka aynı değil veya env için benzeri vars1
,*
mesela. Ve bu yaklaşımı, adı kabuk değişkeni adı olarak geçerli olmayan env vars için kullanamazsınız.