環境変数に何バイトまで設定できるのかご存知の方教えて下さい。
よろしくお願い致します。
Kosuke Ishigooka さん wrote:
>
> UNIX の環境変数を設定する場合、その値の最大バイト数はいくつなのでしょうか?
どの UNIX OS の、どのバージョンの、どの環境変数ですか?
それをはっきりさせないと、ある環境ではともかくご希望の
環境でできるかどうかはわからないのではないかと。
--
+N+ 【新 fj の歩き方 (仮称) の現時点までの成果品は】
西4東 さいとう のぼる<j0...@cocoa.ocn.ne.jp>
+S+ 【http://www2s.biglobe.ne.jp/~kyashiki/fj/arukikata/】
In article <avhaeu$s79$2...@nn-tk102.ocn.ad.jp>, Noboru SAITO <j0...@cocoa.ocn.ne.jp> writes
>> UNIX の環境変数を設定する場合、その値の最大バイト数はいくつなのでしょうか?
>どの UNIX OS の、どのバージョンの、どの環境変数ですか?
やってみりゃいいじゃん... と思うのはぼくだけか?
max_arg はあるけど、env はないな。実は制限はないとか...
---
Shinji KONO @ Information Engineering, University of the Ryukyus,
PRESTO, Japan Science and Technology Corporation
河野真治 @ 琉球大学工学部情報工学科,
科学技術振興事業団さきがけ研究21(機能と構成)
親プロセスの環境変数領域をexecve()の第3引数に渡す
ときは、とりたてて上限はなかったような気がします。
Cのスタートアップルーチンやgetenv()の実装にも上限
はないのではないかしら。
シェルの実装によって扱える環境変数領域のサイズに制
限ができる、というのはあるかもしれませんね。
--
太田純(Junn Ohta) (株)リコー/新横浜事業所
oh...@sdg.mdd.ricoh.co.jp
SolarisやLinux(昔のMS-DOSも)環境変数エリアはスタックにいたので、スタッ
クの最大値とか…
--
___ わしは、山吹色のかすてーらが大好きでのぅ
[[o o]] ふぉっふぉっふぉ
'J' 森下 お代官様 MaNMOS 英夫@ステラクラフト
PGP Finger = CD EA D5 A8 AD B2 FE 7D 02 74 87 52 7C B7 39 37
>親プロセスの環境変数領域をexecve()の第3引数に渡す
>ときは、とりたてて上限はなかったような気がします。
RedHat 7.3 では、130KB くらいに制限があるようです。(テストプロ
グラムは末尾)
[kate@pcc2 tmp]$ ./envtest 131000
sh-2.05a$ exit
[kate@pcc2 tmp]$ ./envtest 132000
cannot exec `/bin/sh'
[kate@pcc2 tmp]$
SunOS 4.1.4 では 1MB くらいまでいけましたが、その状態で sh は環
境変数を参照できるものの、csh は core を吐きました(^^;。
flash 1 > envtest 1048000
$ flash 2 > envtest 1049000
cannot exec `/bin/sh'
flash 3 > envtest 1048000
$ echo $A | wc
1 1 1048001
$ csh
flash% echo $A | wc
Bus error
この csh は、引数が 10KB くらいに制限されていることに関係してい
るのかもしれません。
--
片山@PFU
envtest.c:
#include <stdlib.h>
#include <stdio.h>
#define SHELL "/bin/sh"
char *arg[2] = { SHELL };
char *env[2];
main(int argc, char **argv)
{
int n = 1024 * 1024;
if (argc > 1) {
n = strtol(argv[1], NULL, 10);
}
if (n > 0 && (env[0] = malloc(n + 3))) {
strcpy(env[0], "A=");
memset(env[0] + 2, 'a', n);
env[0][n + 2] = '\0';
execve(SHELL, arg, env);
fprintf(stderr, "cannot exec `" SHELL "'\n");
}
return 1;
}
>SolarisやLinux(昔のMS-DOSも)環境変数エリアはスタックにいたので、スタッ
>クの最大値とか…
そこまでいかないようです。
<KATE.03J...@flash.tokyo.pfu.co.jp> のテストでは、SunOS、
Linux ともに、スタックのリミットは 8MB でした。
--
片山@PFU
>>>>> In <KATE.03J...@flash.tokyo.pfu.co.jp>
>>>>> ka...@pfu.fujitsu.com (KATAYAMA Yoshio) wrote:
> RedHat 7.3 では、130KB くらいに制限があるようです。(テストプロ
> グラムは末尾)
> [kate@pcc2 tmp]$ ./envtest 131000
> sh-2.05a$ exit
> [kate@pcc2 tmp]$ ./envtest 132000
> cannot exec `/bin/sh'
> [kate@pcc2 tmp]$
面白そうなので、FreeBSD 5.0-currentのbash-2.05bで試してみました。
$ uname -a
FreeBSD boggy.acest.tutrp.tut.ac.jp 5.0-CURRENT FreeBSD 5.0-CURRENT #22:
Mon Nov 11 14:42:14 JST 2002
ro...@boggy.acest.tutrp.tut.ac.jp:/usr/obj/usr/src/sys/NAKAJI i386
$ ulimit -s
65536
という状態で、
./envtest 65526
cannot exec `/bin/sh'
でした。64KBくらいでダメなようです。
> SunOS 4.1.4 では 1MB くらいまでいけましたが、その状態で sh は環
> 境変数を参照できるものの、csh は core を吐きました(^^;。
> flash 1 > envtest 1048000
> $ flash 2 > envtest 1049000
> cannot exec `/bin/sh'
> flash 3 > envtest 1048000
> $ echo $A | wc
> 1 1 1048001
> $ csh
> flash% echo $A | wc
> Bus error
同じく、
bash-2.05b$ ./envtest 65525
./envtest 65525
$ echo $A | wc
echo $A | wc
1 1 65526
$ csh
csh
%echo $A
echo $A
Word too long.
でした。
--
NAKAJI Hiroyuki (中治 弘行)
☆Subject: Re: UNIX 環境変数の最大長は?
In article <KATE.03J...@flash.tokyo.pfu.co.jp>
ka...@pfu.fujitsu.com writes:
>> SunOS 4.1.4 では 1MB くらいまでいけましたが、その状態で sh は環
>> 境変数を参照できるものの、csh は core を吐きました(^^;。
>>
>> flash 1 > envtest 1048000
Solaris 2.5 でも同様でした。で、
プロセス自体はもっと持てるようですが、exec あたりが
コケる感じです。 kernel 上の制限でしょうか?
# SunOS5 もカーネルは SunOS4 から引っ張ってる? (^^;
以下、/bin/sh には詳しくないので、大嘘やってるかも...
a.out 1048000
$ B=$A
$ C=$A
$ export B; export C
$ env
/usr/bin/env: arg list too long
$ env > /tmp/tmp
/usr/bin/env: arg list too long
$ set > /tmp/tmp
別ウィンドウから
% wc /tmp/tmp
9 8 3144054 /tmp/tmp
In article <avjjhi$ioc$1...@caraway.media.kyoto-u.ac.jp>
yna...@st.rim.or.jp writes:
>> プロセス自体はもっと持てるようですが、exec あたりが
>> コケる感じです。 kernel 上の制限でしょうか?
ARG_MAX というのがあったので Web 検索したら
いろいろ出てきました。
で、
#include <unistd.h>
sysconf(_SC_ARG_MAX);
の値が、ちょうど 0xfff00 1048320 でした。
増やせないかちょっと探したけど、って増やす人はいないでしょうし
しつこく調べていません :-p
<avjl59$k5o$1...@caraway.media.kyoto-u.ac.jp>の記事において
yna...@st.rim.or.jpさんは書きました。
> man exec をみていたら...
FreeBSD 4.4-RELEASE i386 ですが、execve システムコールを辿ってみ
ました。
> In article <avjjhi$ioc$1...@caraway.media.kyoto-u.ac.jp>
> yna...@st.rim.or.jp writes:
>
> >> プロセス自体はもっと持てるようですが、exec あたりが
> >> コケる感じです。 kernel 上の制限でしょうか?
>
> ARG_MAX というのがあったので Web 検索したら
> いろいろ出てきました。
/usr/src/sys/kern の下であっちゃこっちゃに行ったり来たりしてます
が、kern_exec.c の exec_extract_strings のところで環境変数のコピ
ーに copyinstr を使ってるようで、その際に execve で ARG_MAX をも
とに設定した値をもって制限しているようです。
で、/usr/src/sys/sys/syslimits.h で
#define ARG_MAX 65536 /* max bytes for an exec function */
と定義されている。さらに、jman sysctl で、
名称 型 変更可能
:
kern.argmax 整数 no
とあるので、FreeBSD においては、65536 が上限の様です。と思いきや、
実は環境変数の値の長さは 65525 が上限のようなんですが、なんでかは
もう勘弁てところで。(^^;
--
成田 隆興 @ エー・アイ・ソフト株式会社ソリューシュン開発部
E-mail tak...@aisoft.co.jp
『十分間で決断し、短い理由を添えよ。』
In article <avjsd9$gpa$1...@news01.highway.ne.jp>
>> 成田です。
>> #define ARG_MAX 65536 /* max bytes for an exec function */
>> とあるので、FreeBSD においては、65536 が上限の様です。と思いきや、
>> 実は環境変数の値の長さは 65525 が上限のようなんですが、なんでかは
>> もう勘弁てところで。(^^;
ソースは読んでないのですが、argv + env の MAX が ARG_MAX
であれば、 arg[0]= "/bin/sh\0" で 8byte。 env の "A=" と NULL
で 3byte。ちょうど計 11byteとか? (^^;
--
yna...@st.rim.or.jp
Sun はいないので、クロスなし
といいつつ EXECVE(2V) (SunOS4), exec(2) (SunOS5) 参照しました。(ARG_MAX)
<avlduk$epf$1...@caraway.media.kyoto-u.ac.jp>の記事において
yna...@st.rim.or.jpさんは書きました。
> In article <avjsd9$gpa$1...@news01.highway.ne.jp>
>
> >> とあるので、FreeBSD においては、65536 が上限の様です。と思いきや、
> >> 実は環境変数の値の長さは 65525 が上限のようなんですが、なんでかは
> >> もう勘弁てところで。(^^;
>
> ソースは読んでないのですが、argv + env の MAX が ARG_MAX
> であれば、 arg[0]= "/bin/sh\0" で 8byte。 env の "A=" と NULL
> で 3byte。ちょうど計 11byteとか? (^^;
実は例の envtest をもとに自分で幾つか変更(printf じゃなくて perror
にするとか、環境変数名を変えられるとか、シェルじゃないものも立ち
上げるとか...etc.)して試してたのですが、結論から言うと、まさしく
御推察のとおりです。
で、そう思ってソースを辿れば、確かにそのような感じ(細かく追ってな
いもんで ^^;)。