[LINUX] Ich sehe, ich werde den UNIX-Prozess lesen

――Alles in Ruby spiegelt Unix-Systemaufrufe, Kultur und Ideen wider. ――Mit Ruby können Sie die niedrige Ebene der Sprache überlassen und die Idee von Unix selbst lernen.

Kapitel 1 Einleitung

Kapitel 2 Leitfaden zu diesem Buch

――Die Idee der Unix-Programmierung und ihrer Technologie wird in den nächsten 40 Jahren nützlich sein.

  1. Userland ――Der Ort, an dem das von Ihnen geschriebene Programm ausgeführt wird.
  1. Kernel

--man Seite

  1. Wenn Sie ein Programm in C schreiben und herausfinden möchten, wie Systemaufrufe verwendet werden.
  2. Wenn Sie den Zweck eines Systemaufrufs verstehen möchten.

--Abschnitt der Manpage

  1. Benutzerbefehle, die jeder ausführen kann (Shell-Befehle)
  2. Systemaufruf (vom Kernel bereitgestellte Funktion)
  3. Unterabschnitt (C-Bibliotheksfunktion)
  4. Gerät (spezielle Datei im Verzeichnis / dev)

--Prozess: Unix-Atom

Kapitel 3 Prozess hat ID

Kapitel 3 Prozess hat Eltern

--Beispiel

Kapitel 5 Prozesse haben Dateideskriptoren

--Die Dateibeschreibung repräsentiert eine Ressource

--Dateideskriptoren sind dazu bestimmt, mit dem Prozess zu leben und mit dem Prozess zu sterben.

--Dateideskriptoren werden in der Reihenfolge der kleinsten nicht verwendeten Ganzzahl zugewiesen.

  1. Standardeingang (STDIN)
  2. Standardausgabe (STDOUT)
  3. Standardfehlerausgabe (STDERR)

Kapitel 6 Prozesse haben Ressourcenbeschränkungen

――Wie viele Dateideskriptoren kann ein Prozess haben?

Kapitel 7 Prozess hat eine Umgebung

--ENV implementiert teilweise Enumerable- und Hash-APIs, hat jedoch nicht genau die gleiche Funktionalität wie Hash.

$ RAILS_ENV=production rails server
$ EDITOR=mate bundle open actionpack
$ QUEUE=default rake resque:work

--Umgebungsvariablen werden häufig verwendet, um Eingaben an Befehlszeilentools zu übergeben.

Kapitel 8 Prozesse haben Argumente

$ cat argv.rb
p ARGV
$ ruby argv.rb foo bar -va
["foo", "bar", "-va"]

Kapitel 9 Prozesse haben Namen

  1. Prozessname
  2. Code beenden

Kapitel 10 Prozess hat Endcode

Kapitel 11 Prozesse können untergeordnete Prozesse erstellen

--Kinderprozess

#Sowohl die if- als auch die else-Klausel der if-Anweisung werden ausgeführt
#Auf der übergeordneten Prozessseite wird die PID des erstellten untergeordneten Prozesses zurückgegeben, und auf der untergeordneten Prozessseite gibt fork null zurück.
if fork
  puts "entered the if block" 
else
  puts "entered the else block" 
end
=> entered the if block
entered the else block

--Ist Fork Multi-Core-Programmierung?

--Verwenden Sie Blöcke

fork do
  #Beschreiben Sie hier den Prozess, der im untergeordneten Prozess ausgeführt werden soll
end

#Beschreiben Sie hier den Prozess, der vom übergeordneten Prozess ausgeführt werden soll

Kapitel 12 Orphan Process

Kapitel 13 Der Prozess ist sanft

--Kopie beim Schreiben (CoW, Kopie beim Schreiben)

--CoW ist sehr bequem und schnell, um Ressourcen zu sparen, wenn untergeordnete Prozesse mit Fork (2) erzeugt werden.

Kapitel 14 Prozess kann warten

--Feuer und vergessen --Wenn Sie möchten, dass der untergeordnete Prozess asynchron verarbeitet wird und der übergeordnete Prozess unabhängig fortfahren soll.

message = 'Good Morning'
recipient = '[email protected]'

fork do
  #Erstellen Sie einen untergeordneten Prozess und senden Sie Daten an den Statistiksammler
  #Der übergeordnete Prozess setzt den eigentlichen Nachrichtenversand fort.
  #
  #Als übergeordneter Prozess möchte ich nicht, dass sich diese Arbeit verlangsamt
  #Es ist mir egal, ob die Übertragung an den Statistiksammler aus irgendeinem Grund fehlschlägt.
  StatsCollector.record message, recipient
end

#Senden Sie eine Nachricht an das eigentliche Ziel

--Kinderschutz

Vorher ändern:

fork do
  5.times do
    sleep 1
    puts "I'm an orphan!"
  end
end

abort "Parent process died..."

Nach der veränderung:

fork do
  5.times do
    sleep 1
    puts "I am an orphan!"
  end
end

Process.wait
abort "Parent process died..."
I am an orphan!
I am an orphan!
I am an orphan!
I am an orphan!
I am an orphan!
Parent process died...

Beispiel für eine Interprozesskommunikation ohne Dateisystem oder Netzwerk:

#Spawn 5 untergeordnete Prozesse
5.times do
  fork do
    #Generieren Sie einen zufälligen Wert für jeden untergeordneten Prozess.
    #Wenn es gerade ist, gibt es 111 zurück, und wenn es ungerade ist, gibt es 112 als Endcode zurück.
    if rand(5)
      exit 111
    else
      exit 112
    end
  end
end

5.times do
  #Warten Sie, bis der erzeugte untergeordnete Prozess abgeschlossen ist.
  pid, status = Process.wait2

  #Wenn der Endcode 111 ist
  #Sie können sehen, dass die auf der untergeordneten Prozessseite generierten Werte gerade sind.
  if status.exitstatus == 111
    puts "#{pid} encountered an even number!"
  else
    puts "#{pid} encountered an odd number!"
  end
end
favourite = fork do
  exit 77
end

middle_child = fork do
  abort "I want to be waited on!"
end

pid, status = Process.waitpid2 favourite
puts status.exitstatus

--Process.wait und Process.waitpid verweisen beide auf dieselbe Funktion.

Kapitel 15 Zombie-Prozess

--Entfernen des untergeordneten Prozesses

Beispiel:

message = 'Goog Morning'
recipient = '[email protected]'

pid = fork do
  #Erstellen Sie einen untergeordneten Prozess und senden Sie die Daten an den Statistiksammler
  #Der übergeordnete Prozess setzt den eigentlichen Nachrichtenversand fort.
  # 
  #Als übergeordneter Prozess möchte ich nicht, dass sich diese Arbeit verlangsamt
  #Es ist mir egal, ob die Übertragung an den Statistiksammler aus irgendeinem Grund fehlschlägt.
  StatsCollector.record message, recipient
end

#Stellen Sie sicher, dass der untergeordnete Prozess, der Statistiken sammelt, kein Zombie wird.
Process.detach(pid)

--Kinderprozesse, die sterben, ohne den übergeordneten Prozess zu überspannen, werden ausnahmslos zu Zombieprozessen.

Kapitel 16 Prozesse können Signale empfangen

--Process.wait ist ein blockierender Aufruf --Process.wait ermöglicht es dem übergeordneten Prozess, den untergeordneten Prozess zu verwalten, aber der übergeordnete Prozess kann die Verarbeitung erst fortsetzen, wenn der untergeordnete Prozess beendet ist.

--Beispiel zur Ergänzung von SIGCHLD

child_processes = 3
dead_processes = 0
#Spawn 3 untergeordnete Prozesse
child_processes.times do
  fork do
    #Schlaf jeweils 3 Sekunden
    sleep 3
  end
end

#Danach ist der übergeordnete Prozess mit umfangreichen Berechnungen beschäftigt.
#Ich möchte die Beendigung eines untergeordneten Prozesses erkennen.

#Deshalb,:Ergänzen Sie das CHLD-Signal. Auf diese Weise
#Sie können Benachrichtigungen vom Kernel erhalten, wenn ein untergeordneter Prozess beendet wird.
trap(:CHLD) do
  #Verarbeiten Sie die Informationen des beendeten untergeordneten Prozesses.Wenn Sie es mit warten bekommen,
  #Sie können sehen, welcher der erzeugten untergeordneten Prozesse beendet wurde.
  puts Process.wait
  dead_processes += 1
  #Beenden Sie den übergeordneten Prozess explizit, wenn alle untergeordneten Prozesse beendet wurden.
  exit if dead_processes == child_processes
end

#Schwere Berechnungsverarbeitung
loop do
  (Math.sqrt(rand(44)) ** 8).floor
  sleep 1
end
Process.wait(-1, Process::WNOHANG)
  1. Ignorieren Sie das Signal
  2. Führen Sie eine bestimmte Verarbeitung durch
  3. Führen Sie den Standardprozess aus

—— Signale sind ein großartiges Werkzeug und funktionieren in bestimmten Situationen hervorragend. ――Aber denken Sie daran, dass das Ergänzen von Signalen dem Verwenden globaler Variablen gleicht.

――Die meisten Signale werden in der realen Welt von Prozessen verwendet, die lange laufen, z. B. Server und Dämonen.

Kapitel 17 Prozesse können kommunizieren

Kapitel 18 Dämonenprozess

Kapitel 19 Terminalprozess

Kapitel 20 Fazit

Recommended Posts

Ich sehe, ich werde den UNIX-Prozess lesen
Ich habe SHAPs Zeitung gelesen
[Unix] Was ist der Zombie-Prozess / Orphan-Prozess?
Ich habe die Implementierung von range gelesen (Objects / rangeobject.c)
Ich habe die Varianten von UKR gelesen und implementiert
[Python] Ich werde FTP auf den FTP-Server hochladen.
Ich möchte den Dateinamen von DataLoader sehen
Zum ersten Mal habe ich etwas über Unix (Linux) gelernt.
Versuchen Sie vorerst, Arch Linux zu installieren.
Ich habe die Chainer-Referenz gelesen (von Zeit zu Zeit aktualisiert).
Lesen Sie die OpenCV-Dokumentation
Ich habe die Körner gezählt
Das ... kann den Prozess, den Sie ausführen, nicht sehen? Der Grund für
Ich möchte nur die SudachiPy-Normalisierungsverarbeitung verwenden