Google グループは Usenet の新規の投稿と購読のサポートを終了しました。過去のコンテンツは引き続き閲覧できます。
Dismiss

UNIX環境変数の最大長は?

閲覧: 1 回
最初の未読メッセージにスキップ

Kosuke Ishigooka

未読、
2003/01/08 5:12:012003/01/08
To:
UNIX の環境変数を設定する場合、その値の最大バイト数はいくつなのでしょうか?

環境変数に何バイトまで設定できるのかご存知の方教えて下さい。

よろしくお願い致します。

Noboru SAITO

未読、
2003/01/08 8:56:322003/01/08
To:
さいとう@OCNゆーざ(よくわからないけど)です。

Kosuke Ishigooka さん wrote:
>
> UNIX の環境変数を設定する場合、その値の最大バイト数はいくつなのでしょうか?

どの UNIX OS の、どのバージョンの、どの環境変数ですか?

それをはっきりさせないと、ある環境ではともかくご希望の
環境でできるかどうかはわからないのではないかと。
--
+N+ 【新 fj の歩き方 (仮称) の現時点までの成果品は】
西4東 さいとう のぼる<j0...@cocoa.ocn.ne.jp>
+S+ 【http://www2s.biglobe.ne.jp/~kyashiki/fj/arukikata/

Shinji KONO

未読、
2003/01/08 9:57:082003/01/08
To:
河野 真治@琉球大情報工学です。

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(機能と構成)

Junn Ohta

未読、
2003/01/08 12:44:182003/01/08
To:
fj.unix.shellsの記事<23693.10...@insigna.ie.u-ryukyu.ac.jp>で
ko...@ie.u-ryukyu.ac.jpさんは書きました。

> やってみりゃいいじゃん... と思うのはぼくだけか?
> max_arg はあるけど、env はないな。実は制限はないとか...

親プロセスの環境変数領域をexecve()の第3引数に渡す
ときは、とりたてて上限はなかったような気がします。
Cのスタートアップルーチンやgetenv()の実装にも上限
はないのではないかしら。

シェルの実装によって扱える環境変数領域のサイズに制
限ができる、というのはあるかもしれませんね。
--
太田純(Junn Ohta) (株)リコー/新横浜事業所
oh...@sdg.mdd.ricoh.co.jp

Hideo Sir MaNMOS Morishita

未読、
2003/01/08 21:02:132003/01/08
To:

In article <23693.10...@insigna.ie.u-ryukyu.ac.jp>,

ko...@ie.u-ryukyu.ac.jp (Shinji KONO) writes:
> 河野 真治@琉球大情報工学です。
>
> In article <avhaeu$s79$2...@nn-tk102.ocn.ad.jp>, Noboru SAITO <j0...@cocoa.ocn.ne.jp> writes
> >> UNIX の環境変数を設定する場合、その値の最大バイト数はいくつなのでしょうか?
> >どの UNIX OS の、どのバージョンの、どの環境変数ですか?
>
> やってみりゃいいじゃん... と思うのはぼくだけか?
>
> max_arg はあるけど、env はないな。実は制限はないとか...

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

KATAYAMA Yoshio

未読、
2003/01/08 22:06:322003/01/08
To:
In article <avho1i$ouk$2...@ns.src.ricoh.co.jp>,
oh...@src.ricoh.co.jp (Junn Ohta) writes:

>親プロセスの環境変数領域を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;
}

KATAYAMA Yoshio

未読、
2003/01/08 22:14:122003/01/08
To:
In article <squwulf...@stellar.co.jp>,
man...@stellar.co.jp (Hideo "Sir MaNMOS" Morishita) writes:

>SolarisやLinux(昔のMS-DOSも)環境変数エリアはスタックにいたので、スタッ
>クの最大値とか…

そこまでいかないようです。
<KATE.03J...@flash.tokyo.pfu.co.jp> のテストでは、SunOS、
Linux ともに、スタックのリミットは 8MB でした。
--
片山@PFU

NAKAJI Hiroyuki

未読、
2003/01/08 23:12:112003/01/08
To:
中治です。

>>>>> 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 (中治 弘行)

Nagata Yoshihiro

未読、
2003/01/09 5:39:462003/01/09
To:
# Newsgroups: fj.unix.shells,fj.sys.sun

☆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

--
yna...@st.rim.or.jp

Nagata Yoshihiro

未読、
2003/01/09 6:07:212003/01/09
To:
man exec をみていたら...

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

Narita Takaoki

未読、
2003/01/09 8:11:052003/01/09
To:
成田です。

<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
『十分間で決断し、短い理由を添えよ。』

Nagata Yoshihiro

未読、
2003/01/09 22:16:362003/01/09
To:
| Message-ID: <23693.10...@insigna.ie.u-ryukyu.ac.jp>
で既に max_arg が既出でした(汗)。

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)

Narita Takaoki

未読、
2003/01/09 23:31:202003/01/09
To:
成田です。

<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.)して試してたのですが、結論から言うと、まさしく
御推察のとおりです。

で、そう思ってソースを辿れば、確かにそのような感じ(細かく追ってな
いもんで ^^;)。

新着メール 0 件