Rubin% x Gabeln auf 64-Bit-Linux, aber nicht auf 32, und nur mit bestimmten Syntax

StackOverflow https://stackoverflow.com/questions/214205

  •  03-07-2019
  •  | 
  •  

Frage

Hier ist ein Ruby-Code:

puts %x{ pstree #{$$} }   # never forks
puts %x{ pstree '#{$$}' } # forks on amd64 only

Auf 32-Bit Ubuntu Dapper, erhalte ich folgende Ausgabe:

t.rb---pstree
t.rb---pstree

Was macht Sinn für mich. Aber auf 64-Bit Ubuntu Hardy, bekomme ich diese:

t.rb---sh---pstree
t.rb---pstree

Was wird hier gezeigt ist, dass Ruby Gabeln vor in nur einer der Fälle exec'ing. Wenn ich den Code in einer Datei speichern, und es unter strace -Ff laufen, scheint es, dass auf 64-Bit-Hardy clone() es nennt (wie fork()) vor execve(), während auf 32-Bit-Dapper es tut so etwas nicht.

Meine Ruby-Versionen sind:

ruby 1.8.4 (2005-12-24) [i486-linux]
ruby 1.8.6 (2007-09-24 patchlevel 111) [x86_64-linux]

Ich soll versuchen, Mischen und passende Dolmetscher & OS & Wortgrößen mehr, aber jetzt ist es nicht einfach, da ich nicht, diese Maschinen verwalten. Vielleicht hat jemand von euch kann mir sagen, was ist der Unterschied auch zwischen diesen Befehlen auf dem 64-Bit-System ist, geschweige denn, warum sie das gleiche auf dem 32-Bit einer arbeiten.

War es hilfreich?

Lösung

Rubin führt Shell Expansion, wenn% x mit einem einzigen Argument verwendet wird (wie Sie tun).

Hier ist meine Vermutung, was los ist:

Rubin scannt den Befehl, um zu bestimmen, ob es irgendwelche Sonderzeichen sind, die zu der Notwendigkeit führen würden Shell Expansion durchzuführen, wenn so ruft er die Schale, das zu tun. Im zweiten Beispiel sind die einfachen Anführungszeichen genug, um Ruby den Shell aufgerufen werden soll die Expansion zu tun, damit die Gabel. Im ersten Beispiel kann Rubin bestimmen, dass Shell Expansion nicht als der Befehl benötigt wird, keine Sonderzeichen enthält (nach variable Expansion), damit keine Gabel. Der Unterschied zwischen den beiden Versionen hat wahrscheinlich mit einer internen Veränderung zu tun, wie Rubin versucht ist Shell Expansion zu bestimmen, benötigt wird. Ich erhalte eine Gabel für das zweite Beispiel auf Rubin 1.8.5 auf einer 32-Bit-Maschine.

[EDIT]

Okay, habe ich einen Blick auf den Quellcode für Ruby 1.8.4 und 1.8.6 und beide Versionen verwenden die gleichen Kriterien zu bestimmen, ob oder nicht eine Schale zu nennen Shell-Erweiterung durchzuführen, wenn eine der folgenden Zeichen bestehen in der Befehlszeile wird die Shell aufgerufen werden, wenn ein Argument zu x% vorgesehen ist:

*?{}[]<>()~&|\\$;'`"\n

Rubin ruft tatsächlich die Schale in beiden Fällen (in Beispiel, das die Anführungszeichen enthält), der Grund, warum Sie verschiedene Ausgänge von pstree sehen an den verschiedenen Maschinen zu Unterschieden in dem Sport sh Befehl zurückzuführen ist, nennt man fork, die andere nicht. Um dies zu sehen für sich selbst, führen Sie diesen Befehl auf beiden Maschinen:

/bin/sh -c "pstree $$"

Dies ist der Befehl, die Ruby verwendet pstree im Beispiel mit Zitaten auf beiden Rechner auszuführen. Sie sollten bash---pstree auf der 32-Bit-Maschine und bash---sh---pstree auf dem anderen sehen.

So, jetzt bin ich gespannt, was Sie führte diesen Unterschied zu entdecken und es verursacht ein Problem?

Andere Tipps

ging ich durch diese Situation durch eine asynchronen Prozessor Arbeit zu entwickeln, die eine Reihe von Teilprozessen (Gabel) hat, und es geschah, als der Meister im Vordergrund stand und erhielt eine SIGINT.

Ich betreibe: puts "ist das Ergebnis% (Monster verzögerte-job)"

und der Ausgang war nur: „das Ergebnis“

  • Ja, Im "Fall" SIGINT im Master

Andre

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top