[LINUX] Behälterartig hergestellt mit C # 1

Einführung

Dieser Artikel ist der 22. Artikel von FuraIT Adventars Calendar. Entschuldigung für die Verspätung. Ich dachte gestern war der 22 ..

Es wird auch dem unter hier angekündigten Inhalt ähnlich sein. Vielleicht ist es interessanter, wenn Sie es ankündigen. Wenn Sie interessiert sind, schließen Sie sich uns an.

Es hat nichts mit FuraIT zu tun, aber ich werde weitermachen, ohne mir darüber Sorgen zu machen.

Umgebung

ich werde machen

Mit "# 1" möchte ich diesmal den Teil ausführen, der Fork, Exec und Wait in C-Sprache behandelt. Ich weiß nicht, ob ich weitermachen werde.

fork Zunächst müssen Sie den Prozess abspalten. Es gibt auch Linux-spezifische Bibliotheken. Wenn Sie also Windows verwenden, tun Sie dies bitte selbst.

#include<sys/types.h>
#include<unistd.h>
#include<stdio.h>

int main(){
  pid_t pid;

  if ((pid = fork()) < 0){
    perror("fork");
    return 1;
  } 
  //Verarbeitung auf der untergeordneten Prozessseite
  else if (pid == 0) {
    printf("child process:%d\n",(int)getpid());
    _exit(0);
  }
  printf("parent proces:%d\n",(int)getpid());
  return 0;
}

Ausführungsergebnis

parent proces:28540
child process:28541

Es war so. ~~ Die Verarbeitung auf der übergeordneten Prozessseite wird zuerst ausgeführt. ~~

Wenn Sie sich Manpage von FORK ansehen, können Sie es sehen. Wenn der Rückgabewert von fork ein positiver Wert ist, ist dies die untergeordnete Prozess-ID. Wenn es 0 ist, wird es als erfolgreicher Fork an den untergeordneten Prozess zurückgegeben. Daher können Sie durch Angabe von pid == 0 eine Verarbeitung durchführen, die für den untergeordneten Prozess eindeutig ist.


exec Nachdem wir den untergeordneten Prozess erfolgreich aufgerufen haben, ist es Zeit, das externe Programm innerhalb des untergeordneten Prozesses auszuführen. Um ein externes Programm auszuführen, muss ein Exec-Systemaufruf aufgerufen werden. Diesmal habe ich mich für execl entschieden.

#include<sys/types.h>
#include<unistd.h>
#include<stdio.h>

int main(){
  pid_t pid;

  if ((pid = fork()) < 0){
    perror("fork");
    return 1;
  } 
  //child process
  else if (pid == 0) {
    printf("child process:%d\n",(int)getpid());
    execl("/bin/bash","",NULL);
    _exit(0);
  }
  printf("parrent proces:%d\n",(int)getpid());
  return 0;
}

Man page of EXEC  Die Erklärung des Exec-Systems wird lang sein, daher werde ich es weglassen.

~~ Ich habe / bin / bash von einem untergeordneten Prozess ausgeführt, aber es passiert nichts. Dies liegt daran, dass der untergeordnete Prozess stirbt, wenn der übergeordnete Prozess beendet wird. Daher muss der übergeordnete Prozess warten, bis der untergeordnete Prozess abgeschlossen ist. ~~


wait Sie können mit einem Systemaufruf warten, bis der untergeordnete Prozess abgeschlossen ist. Diesmal habe ich waitpid verwendet. Vergessen Sie nicht, sys / wait.h einzuschließen.

#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdio.h>

int main(){
  pid_t pid;
  int status;

  if ((pid = fork()) < 0) {
    perror("fork");
    return 1;
  } 
  //child process
  else if (pid == 0) {
    printf("child process:%d\n",(int)getpid());
    execl("/bin/bash","",NULL);
    perror("bash");
    _exit(1);
  }
  
  printf("parrent proces:%d\n",(int)getpid());
  if ((pid = waitpid(pid,&status,0)) < 0) {
    perror("wait");
    return 1;
  }
  if (WIFEXITED(status)) {
    printf("pid:%d status:%d\n",(int)getpid(),WEXITSTATUS(status));
  }
  return 0;
}

Sie können alles unter Manpage von WAIT sehen. waitpid ist die Prozess-ID, die auf das Ende wartet, die Variable, die den Endstatus festlegt, und die dritte Option ist die Option (spielt jetzt keine Rolle). WIFEXITED () ist wahr, wenn der untergeordnete Prozess beendet wird, und WEXITSTATUS () kann seinen Beendigungsstatus abrufen. Verwenden Sie für das Ausführungsergebnis den Befehl ps, um zu bestätigen, dass die ID des übergeordneten Prozesses und die ID des untergeordneten Prozesses vorhanden sind. Zu diesem Zeitpunkt können Sie den Vorgang mit dem Befehl chroot überprüfen. Er sollte jedoch in '# 2' eingeführt werden. Warten Sie also bitte.

das Ende!

'# 1'ends hier. Ich würde gerne '# 2' schreiben, wenn ich Lust dazu habe. Bitte zögern Sie nicht, mich zu kontaktieren, wenn es Fehler oder verwirrende Punkte gibt.

Wo ich mich bezog

http://chikuwait.hatenablog.com/entry/2017/10/05/001126

Recommended Posts

Behälterartig hergestellt mit C # 1
C / C ++ - Debugging mit gdb
Pomodoro Timer mit Errbot gemacht
Heap-Sortierung in C-Sprache
Versuchen Sie Google Mock mit C.
Ich habe einen Blackjack mit Python gemacht!
Formatieren Sie die Sprachquelle C mit pycparser
Ich habe COVID19_simulator mit JupyterLab erstellt
Ich habe Word2Vec mit Pytorch gemacht
Ich habe mit Python einen Blackjack gemacht.
Othello gemacht mit Python (wie GUI)
Ich habe Wordcloud mit Python gemacht.
Ich habe eine C ++ - Lernseite erstellt
Löse ABC163 A ~ C mit Python
Mit Flask erstellte SNS Python-Grundlagen
Erstellen Sie Awaitable mit der Python / C-API
Schreiben der C-Sprache mit Sympy (Metaprogrammierung)
Numer0n mit Elementen, die mit Python erstellt wurden
Ich habe mit Python eine Lotterie gemacht.
Twitter-Posting-Anwendung mit Django gemacht
Löse ABC168 A ~ C mit Python
Othello-Spieleentwicklung mit Python
AtCoder ABC 114 C-755 mit Python3 gelöst
Löse ABC162 A ~ C mit Python
Löse ABC167 A ~ C mit Python
Löse ABC158 A ~ C mit Python
Twitter-Such-Client mit Flasche gemacht
Segfo mit 16 Zeichen in C-Sprache
Ich habe mit Python einen Daemon erstellt
Beschleunigen Sie die C / C ++ - Kompilierung mit ccache
Ihr eigener Twitter-Client mit Django
Einfacher RSS-Reader mit Django
Einfacher Slack API-Client mit Python
HTTP Split Download Typ mit Python gemacht
Ich habe mit Python einen Zeichenzähler erstellt
X86 Assembler unter Linux (Verknüpfung mit C)
Einfache mehrsprachige C / C ++ - Bindung mit CMake + SWIG
[C] [Python] Lesen mit AquesTalk unter Linux
Verbesserter menschlicher Sensor mit Raspberry Pi
Ich habe mit Python eine Hex-Map erstellt
Ich habe ein Lebensspiel mit Numpy gemacht
Ich habe einen Hanko-Generator mit GAN gemacht
Verwenden von C ++ - Funktionen aus Python mit pybind11
Serverlose Gesichtserkennungs-API mit Python
Ich habe mit Python ein schurkenhaftes Spiel gemacht
Ich habe mit Python einen einfachen Blackjack gemacht
RaspberryPi L Chika mit Python und C #
[C, C ++, Python, JavaScript] L Chika mit Edison
Ich habe mit Python eine Einstellungsdatei erstellt
Ich habe eine WEB-Bewerbung bei Django gemacht
Ich habe mit Python einen Neuronensimulator erstellt
Kommunizieren Sie mit I2C-Geräten unter Linux C.
Othello App (iOS App) erstellt mit Python (Kivy)