2011-10-05 16 views
8

Öğretmenlerimizi yorumlamakta çok fazla sorun yaşıyoruz. Biz olabildiğince bu şekilde dışarı aktarılan değişkenler bunu bir ortam kurulumları göndermek ve/bin/bash bir altkabuk çalıştırmak yerleşik bir komutu oluşturmak, açıklama istedi ve geri ondanYürütme ve ayar ortamı gereksinimlerini anlama

  1. execve için aşağıdaki var dışa aktarılan değişkenlerinizi env.

    (Burada kendi ortamı oluşturma hakkında vars konuşuyor.)

  2. Evet kendi oluşturun. Sen environ kopyalayarak başlayabilirsiniz zaman kabuk başlar ve eklemek sadece ihraç değişkenler

Bu (Ne yapmaya çalışıyorum anlamak yardımcı olacak bu diğer yazı okumayı) tarafımdan Yığın taşması aşağıdaki yazı ile ilgilidir:

using a new path with execve to run ls command

Biz sadece bu konuda çok karıştı. Bir daha şimdi, şimdi yapmaya çalıştığımız şeyi açıklayacağım. Linux kabuğunuzun bunu nasıl yaptığı gibi, PATH ve USER gibi ortam değişkenlerini ve kullanıcının tanımlamak istediği diğer varyantları ayarlayabilen kendi programımızı yazmamız gerekir.

bu (kendi istemi adresinden programı içinde) olacağını çağırır nasıl bir örnek:

mysetenv dog spike 

Daha da önemlisi "köpek = başak"

benzeyen bir ortam değişkeni yaratacak, Kendi PATH değişkenimizi ayarlayıp exec komutuna gönderebilmemiz gerekir. Bu kafa karıştırıcı bölümdür, çünkü tüm sorularımıza dayanarak, ne yapmamız gerektiğini anlamıyoruz.

cevap

26

Aslında çok basittir. Argümanlarınızın bir NULL işaretçisiyle sonlanan char * listesi olduğunu zaten biliyorsunuz. Benzer şekilde, çevre sadece bir NULL işaretçi tarafından sonlandırılan char * listesidir. Geleneksel olarak, listedeki değerler VARNAME=var-value şeklini alır, ancak isterseniz başka formatları da geçirebilirsiniz.

Yani, basit bir davayı almak: Bu örnekte

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

int main(void) 
{ 
    char *argv[] = { "/bin/sh", "-c", "env", 0 }; 
    char *envp[] = 
    { 
     "HOME=/", 
     "PATH=/bin:/usr/bin", 
     "TZ=UTC0", 
     "USER=beelzebub", 
     "LOGNAME=tarzan", 
     0 
    }; 
    execve(argv[0], &argv[0], envp); 
    fprintf(stderr, "Oops!\n"); 
    return -1; 
} 

program kabuk bugünkü PATH üzerinde bulunan env programı çalışacağı anlamına gelir argümanları -c ve env ile /bin/sh çalışacaktır. Buradaki ortam ortodoks biçiminde 5 değer içerecek şekilde ayarlanmıştır. env'u date (veya env; date) olarak değiştirirseniz, örneğin, TZ ayarının etkisini görürsünüz. Benim MacOS X bilgisayarında bu çalıştırdığınızda, çıkış geçerli:

USER=beelzebub 
PATH=/bin:/usr/bin 
PWD=/Users/jleffler/tmp/soq 
TZ=UTC0 
SHLVL=1 
HOME=/ 
LOGNAME=tarzan 
_=/usr/bin/env 

kabuk ben execve() çağrısında açıkça belirlenen olanlar için ortam değişkenlerini SHLVL, _ ve PWD eklemiştir. Ayrıca, diğer ortam değişkenlerinin bazılarında, açıkça belirtmek istediğinizle çakışmadıkları gerçek ortamınızdan kopyalamak gibi merak uyandıran şeyler de yapabilirsiniz.Ayrıca, çevrede tek bir değişken için iki değere sahip olmak gibi oyunlar oynayabilirsiniz - hangisi etkilidir? Ve boşluk içeren değişken isimleri olan oyunları (kabuk o kadar sevmez) ya da “varname = değer” notasyonuyla eşleşmeyen girdileri (eşittir işareti yok) oynatabilirsiniz.

+0

Gerçekten benim için hepsini temizlediniz. Zaten her şeyi açtım ama teşekkürler! şimdi anladım. – james

1

Eğer PWD (çalışma dizini) değişkeni değiştirmek istiyorsanız dışında inşaat büyükJonathan Leffler'ın gelen kodu.

Ne yaptıysam, çalışma dizinini değiştirmek için, execve(..) önce chdir(..) koymak ve aramak oldu:

chdir("/foo/bar"); 
execve(argv[0], &argv[0], envp); 
0

Burada geç partiye biraz dilerim ama korumak istiyorsanız Eski ortam değişkenlerini kendi oluştururken, setenv kullanın ve environ'u execve()'a aktarın.

setenv("dog", "spike", 1); 
    extern char** environ; 
    execve(argv[0], argv, environ); 

environ

unistd.h bildirilen değişken olduğunu ve bu koşu esnasında ortam değişkenleri izler.

setenv() ve putenv()environ değiştirmek, bu nedenle execve() üzerine geçerken, çevre değişkenleri beklediğiniz gibi olacak.