2011-10-05 16 views
8

私たちは先生の通訳に苦労しています。私たちは、あなたができる、そのようにエクスポートした変数とそれに環境あなたのセットアップを送信し、/ binに/ bashののサブシェルを起動するための組み込みコマンドを作成し、明確化を求め、バック彼からexecveと環境変数の要件を理解してください

  1. はexecveについては、次のですenvを使用してエクスポートされた変数を確認してください。

    (彼はここで独自の環境変数を作成しています)

  2. はい独自の作成します。シェルが起動するときにenvironをコピーし、エクスポートされた変数のみを追加することから始めることができます。

これは、私が何をしようとしているのかを理解するのに役立ちます。

using a new path with execve to run ls command

私達はちょうどこのことについて非常に混乱しています。もう一度、今私たちがしようとしていることを説明します。 Linuxシェルがこれを行うのと同様に、PATHやUSERのような環境変数や、ユーザが定義したい他の変数を設定できる独自のプログラムを書く必要があります。

あなたは、これが(そのプロンプトプログラム内)になり呼び出す方法の例:

mysetenv dog spike 

さらに重要なのは「犬=スパイク」

のように見える環境変数を作成し、独自のPATH変数を設定してexecコマンドに送る必要があります。これは、すべての質問に基づいて、私たちがやるべきことを理解していないので、混乱する部分です。

答えて

26

実際は非常に簡単です。引数がNULLポインタで終了したchar *のリストであることはすでに分かっています。同様に、環境は単純にNULLポインタで終了するchar *のリストです。従来は、リスト内の値はVARNAME=var-valueという形式になっていましたが、必要に応じて他の形式を渡すこともできます。

ので、シンプルなケース取るために:この例では

#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; 
} 

を、プログラムはシェルが現在のPATHで見つかったenvプログラムを実行することを意味し、引数-cenv/bin/shを実行します。ここの環境は、正統的な形式で5つの値を含むように設定されています。 envdate(またはenv; date)に変更すると、たとえばTZ設定の効果が表示されます。私は私のMacOS Xマシン上でそれを実行すると、出力は次のようになります。

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

シェルは、私がexecve()呼び出しで明示的に設定したものに、環境変数SHLVL_PWDを追加しました。

また、あなたが明示的に設定したいものと矛盾しない本物の環境から、他の環境変数の一部をコピーするなど、好きなことをすることもできます。環境内の1つの変数に対して2つの値を持つようなゲームをプレイすることもできます。また、スペースを含む変数名(シェルはあまり好きではありません)、または 'varname = value'表記とまったく一致しない(等号なし)エントリでゲームをすることができます。

+0

あなたは本当に私のためにそれをすべてクリアしました。私はすでにすべてを入れましたが、ありがとう!わかった。 – james

1

コードよりジョナサン・レフラーは、PWD(作業ディレクトリ)変数を変更したい場合を除いて、うまくいきます。

私が何をしたか

、作業ディレクトリを変更するために、execve(..)chdir(..)を入れて呼び出すことでしたが:

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

私はここにパーティーに少し遅れだけど、あなたが保存したい場合は古い環境変数と独自の環境変数を作成するには、setenvを使用し、次にenvironexecve()に渡します。

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

environunistd.hで宣言された変数であり、そしてそれは、この実行中のプロセスの間に環境変数を追跡します。

setenv()putenv()environを変更すると、execve()に渡すと、環境変数は期待どおりになります。

関連する問題