[#3587] Multiple assignment at yield() — Shin-ichro Hara <sinara@...>

原です。

86 messages 1998/11/17
[#3588] Re: Multiple assignment at yield() — matz@... (Yukihiro Matsumoto) 1998/11/17

まつもと ゆきひろです

[#3589] Re: Multiple assignment at yield() — Shin-ichro Hara <sinara@...> 1998/11/17

原です。

[#3590] Re: Multiple assignment at yield() — matz@... (Yukihiro Matsumoto) 1998/11/17

まつもと ゆきひろです

[#3594] Re: Multiple assignment at yield() — Shin-ichro Hara <sinara@...> 1998/11/18

原です。

[#3595] Re: Multiple assignment at yield() — matz@... (Yukihiro Matsumoto) 1998/11/18

まつもと ゆきひろです

[#3596] Re: Multiple assignment at yield() — Shin-ichro Hara <sinara@...> 1998/11/18

原です。

[#3598] Re: Multiple assignment at yield() — matz@... (Yukihiro Matsumoto) 1998/11/19

まつもと ゆきひろです

[#3600] Re: Multiple assignment at yield() — Shin-ichro Hara <sinara@...> 1998/11/20

原です。

[#3610] Re: Multiple assignment at yield() — Shin-ichro Hara <sinara@...> 1998/11/20

原です。

[#3611] Re: Multiple assignment at yield() — matz@... (Yukihiro Matsumoto) 1998/11/20

まつもと ゆきひろです

[#3622] Re: Multiple assignment at yield() — Shin-ichro Hara <sinara@...> 1998/11/21

原です。

[#3630] Re: Multiple assignment at yield() — shugo@... (MAEDA Shugo) 1998/11/22

前田です。

[#3635] Re: Multiple assignment at yield() — Shin-ichiro Hara <sinara@...> 1998/11/23

原です。

[#3658] Re: Multiple assignment at yield() — matz@... (Yukihiro Matsumoto) 1998/11/24

まつもと ゆきひろです

[#3660] Re: Multiple assignment at yield() — Shin-ichro Hara <sinara@...> 1998/11/24

原です。

[#3722] multiple assignment, yield and return — Shin-ichro Hara <sinara@...> 1998/12/01

原です。

[#3724] Re: multiple assignment, yield and return — Shin-ichro Hara <sinara@...> 1998/12/01

原です。

[#3742] List() — Shin-ichro Hara <sinara@...> 1998/12/04

原です。

[#3743] Re: List() — shugo@... (MAEDA Shugo) 1998/12/06

前田です。

[#3744] Re: List() — Shin-ichiro Hara <sinara@...> 1998/12/06

原です。

[#3755] Re: List() — shugo@... (MAEDA Shugo) 1998/12/07

前田です。

[#3758] Re: List() — Shin-ichro Hara <sinara@...> 1998/12/07

原です。

[#3760] Re: List() — shugo@... (MAEDA Shugo) 1998/12/07

前田です。

[#3761] Re: List() — Shin-ichiro Hara <sinara@...> 1998/12/07

原です。

[#3774] Re: List() — shugo@... (MAEDA Shugo) 1998/12/08

前田です。

[#3780] Re: List() — Shin-ichiro Hara <sinara@...> 1998/12/08

原です。

[#3784] Re: List() — shugo@... (MAEDA Shugo) 1998/12/09

前田です。

[#3788] Re: List() — Shin-ichro Hara <sinara@...> 1998/12/09

原です。

[#3789] Re: List() — MAEDA Shugo <shugo@...> 1998/12/10

前田です。

[#3602] problem of Delegator — keiju@... (Keiju ISHITSUKA)

けいじゅ@日本ラショナルソフトウェアです.

17 messages 1998/11/20
[#3605] Re: problem of Delegator — matz@... (Yukihiro Matsumoto) 1998/11/20

まつもと ゆきひろです

[#3606] Re: problem of Delegator — keiju@... (石塚圭樹 ) 1998/11/20

けいじゅ@日本ラショナルソフトウェアです.

[#3607] Re: problem of Delegator — matz@... (Yukihiro Matsumoto) 1998/11/20

まつもと ゆきひろです

[#3612] Re: problem of Delegator — keiju@... (石塚圭樹 ) 1998/11/20

けいじゅ@日本ラショナルソフトウェアです.

[#3613] Re: problem of Delegator — matz@... (Yukihiro Matsumoto) 1998/11/20

まつもと ゆきひろです

[#3626] block local variable (Re: スコープの範囲) — shugo@... (MAEDA Shugo)

前田です。

47 messages 1998/11/22
[#3628] Re: block local variable (Re: スコープの範囲) — Koji Arai <JCA02266@...> 1998/11/22

新井です。

[#3629] Re: block local variable (Re: スコープの範囲) — shugo@... (MAEDA Shugo) 1998/11/22

前田です。

[#3632] Re: block local variable (Re: スコープの範囲) — Koji Arai <JCA02266@...> 1998/11/22

新井です。

[#3633] Re: block local variable (Re: スコープの範囲) — shugo@... (MAEDA Shugo) 1998/11/22

前田です。

[#3636] Re: block local variable (Re: スコープの範囲) — Shin-ichiro Hara <sinara@...> 1998/11/23

原です。

[#3642] Re: block local variable (Re: スコープの範囲) — Koji Arai <JCA02266@...> 1998/11/23

新井です。

[#3645] Re: block local variable(Re: スコープの範囲) — Shin-ichiro Hara <sinara@...> 1998/11/23

原です。

[#3674] Re: block local variable(Re: スコープの範囲) — Koji Arai <JCA02266@...> 1998/11/25

新井です。

[#3678] Re: block local variable(Re: スコープの範囲) — matz@... (Yukihiro Matsumoto) 1998/11/26

まつもと ゆきひろです

[#3681] Re: block local variable(Re: スコープの範囲) — Kazuhiro HIWADA <hiwada@...> 1998/11/26

ひわだです。

[#3682] Re: block local variable(Re: スコープの範囲) — Shin-ichro Hara <sinara@...> 1998/11/26

原です。

[#3683] Re: block local variable(Re: スコープの範囲) — matz@... (Yukihiro Matsumoto) 1998/11/26

まつもと ゆきひろです

[#3684] Re: block local variable(Re: スコープの範囲) — Shin-ichro Hara <sinara@...> 1998/11/26

原です。

[#3685] Re: block local variable(Re: スコープの範囲) — matz@... (Yukihiro Matsumoto) 1998/11/26

まつもと ゆきひろです

[#3709] ruby-1.1c9 install 中に SEGV — Koji Arai <JCA02266@...>

新井です。

18 messages 1998/11/30

[ruby-dev:3701] [BUG?] fork(2) and read(2)

From: WATANABE Tetsuya <tetsu@...>
Date: 1998-11-30 00:22:53 UTC
List: ruby-dev #3701
渡辺です。

以下のような現象がでているので検討ください。

今朝会社で試したら、かなり転送サイズを大きくしないと再現し
ませんでした。

Pentium II 266MHz では

------------------------------
  msg = '0123456789' * 100 * 32 * 2
  0.upto(1000) do
    c.request(msg)
  end
------------------------------

です。自宅のシステムは Pentium 166MHz です。

■ 現象

fork した場合、socket で通信中に子プロセスが、SIGVTALRM で
終了してしまう。

ソケットを使用した通信のスクリプトに fork と setsid でデー
モンプロセスになるように設定する。fork を使用する前は、正
常に動作していたスクリプトが、fork することで動作しなくな
る。

症状としては、通信中に中途半端なところで中断してしまう。

strace(1) などのツールを使って確認してみたところ、fork(2) 
後 setitimer(2) でインターバルタイマの初期化が行われ、シグ
ナルハンドラが設定されていないため中断していることがわかる。

process.c を確認したら、Linux のシステムだけが 
setitimer(2) (after_exec())していることに気がつきパッチを
作成。

■ 環境

Linux 2.0.36 glibc-2.0.7 (TurboLinux 2.0J)
Ruby 1.1c9

■ 再現スクリプト

udp のポートとして 22222 使います。空いているとは思います
が、一応確認してください(netstat -a で)。

もしかすると速い CPU では、udp で送るメッセージをもっと大
きくしないと再現しないかもしれません。というのは、メッセー
ジを受けとる read(2) 中にインターバルタイマを受けて落ちる
のが現象のためです。インターバルタイマで呼ばれる前に 
read(2) が終了してしまうと現象は起きないと思います。

#! /usr/local/bin/ruby
# /home/tetsu/src/ruby/bug/fork.rb
# Created: November 29,1998 Sunday 05:25:13
# Author: tetsu(WATANABE Tetsuya)
# $Id$
# usage:

require 'socket'

class Ssample
  def initialize
    @udp = UDPsocket.open
    @udp.bind('localhost', 22222)

    @from = nil
  end

  def request
    ret = @udp.recvfrom(32 * 1024, 0)
    @from = ret[1]
    ret[0]
  end
  
  def reply(msg)
    @udp.send(msg, 0, *@from)
  end
end

class Csample
  def initialize
    @udp = UDPsocket.open
    @udp.connect('localhost', 22222)
  end

  # server module
  def request(msg)
    @udp.send(msg, 0)
    ret = @udp.recvfrom(32 * 1024, 0)
    @from = ret[1]
    ret[0]
  end
end    

if Process.fork
  # p
  sleep 1
  c = Csample.new
  print c.request('msg'), "\n"

  msg = '0123456789' * 100
  0.upto(100) do
    c.request(msg)
  end

  print c.request('EXIT'), "\n"
else
  # c
  s = Ssample.new
  while msg = s.request
    s.reply(msg)
    break if msg == 'EXIT'
  end
end

exit

■ 実行方法

$ strace -f ruby fork.rb 2> strace.txt

■ 結果

省略

[pid  3119] sendto(4, "01234567890123456789012345678901"...,
 1000, 0, {sin_family=AF_INET, sin_port=htons(1115),
  sin_addr=inet_addr("127.0.0.1")}, 16) = 1000
[pid  3119] --- SIGVTALRM (Virtual time alarm) ---
[pid  3119] +++ killed by SIGVTALRM +++
<... send resumed> )                    = 1000
--- SIGCHLD (Child exited) ---

省略

子プロセスが、SIGVTALRM にて終了してしまっています。

■ パッチ

fork(2) の後で、どうして Linux だけが特別扱いになっている
のか私には理由がわからないので、もしかするとこのパッチはま
ずいかもしれません。

処理に問題がなければ、このパッチを採用してください。

--- process.c.org	Tue Oct  6 11:45:00 1998
+++ process.c	Sun Nov 29 06:30:04 1998
@@ -543,9 +543,6 @@
     rb_secure(2);
     switch (pid = fork()) {
       case 0:
-#ifdef linux
-	after_exec();
-#endif
 	if (iterator_p()) {
 	    rb_yield(Qnil);
 	    _exit(0);


■ ということで

socket でサービスするデーモンのスクリプトを書いて、一通り
の処理ができるようになったので、デーモンにすべく fork と 
setsid を呼びだしました。そしたら、長いメッセージの場合中
途半端なところでプロセスが死んでしまって、処理がうまく行き
ません。「あれ?」ということで...

p.s. E-mail がたくさんたまっている月曜日は大変ですね。
     まつもとさん。

--
WATANABE Tetsuya HP Japan
 e-mail  Tetsuya_WATANABE@hp.com
         tetsu@jpn.hp.com

In This Thread

Prev Next