[LINUX] En forme de conteneur réalisé avec C # 1

introduction

Cet article est le 22e article de FuraIT Adventars. Désolé d'être en retard. Je pensais qu'hier était le 22.

De plus, il sera similaire au contenu annoncé sur ici. C'est peut-être plus intéressant lorsque vous l'annoncerez, alors si vous êtes intéressé, rejoignez-nous

Cela n'a rien à voir avec FuraIT, mais je vais continuer sans m'en soucier.

environnement

je ferai

Avec "# 1", cette fois je voudrais faire la partie qui gère fork, exec et wait en langage C. Je ne sais pas si je vais continuer.

fork Tout d'abord, vous devez bifurquer le processus. Il existe également des bibliothèques spécifiques à Linux, donc si vous utilisez Windows, veuillez faire quelque chose vous-même.

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

int main(){
  pid_t pid;

  if ((pid = fork()) < 0){
    perror("fork");
    return 1;
  } 
  //Traitement côté processus enfant
  else if (pid == 0) {
    printf("child process:%d\n",(int)getpid());
    _exit(0);
  }
  printf("parent proces:%d\n",(int)getpid());
  return 0;
}

Résultat d'exécution

parent proces:28540
child process:28541

C'était comme ça. ~~ Le traitement côté processus parent est exécuté en premier. ~~

Si vous regardez Man page of FORK, vous pouvez le voir. Si la valeur de retour de fork est une valeur positive, il s'agit de l'ID de processus enfant. S'il vaut 0, il est renvoyé au processus enfant comme un fork réussi. Par conséquent, en spécifiant pid == 0, vous pouvez effectuer un traitement unique pour le processus enfant.


exec Maintenant que nous avons appelé avec succès le processus enfant, il est temps d'exécuter le programme externe à l'intérieur du processus enfant. Pour exécuter un programme externe, il est nécessaire d'appeler un appel système exec. Cette fois, j'ai décidé d'utiliser execl.

#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  L'explication du système exec sera longue, je vais donc l'omettre.

~~ J'ai exécuté / bin / bash à partir d'un processus enfant mais rien ne se passe. Cela est dû au fait que le processus enfant meurt lorsque le processus parent se termine. Par conséquent, le processus parent doit attendre la fin du processus enfant. ~~


wait Vous pouvez attendre la fin du processus enfant à l'aide d'un appel système d'attente. Cette fois, j'ai utilisé waitpid. N'oubliez pas d'inclure sys / wait.h.

#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;
}

Vous pouvez tout voir en regardant Man page of WAIT. waitpid est l'ID de processus qui attend la fin, la variable qui met l'état de fin, et la troisième option est option (cela n'a pas d'importance maintenant). WIFEXITED () est vrai lorsque le processus enfant se termine et WEXITSTATUS () peut récupérer son état de sortie. En ce qui concerne le résultat de l'exécution, utilisez la commande ps pour confirmer que l'ID du processus parent et l'ID du processus enfant existent. À ce stade, vous pouvez vérifier l'opération en utilisant la commande chroot, mais elle devrait être introduite dans '# 2', alors veuillez patienter.

la fin!

'# 1 se termine ici. J'aimerais écrire '# 2' quand j'en ai envie. N'hésitez pas à me contacter s'il y a des erreurs ou des points confus.

Où j'ai référé

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

Recommended Posts

En forme de conteneur réalisé avec C # 1
Débogage C / C ++ avec gdb
Minuterie Pomodoro faite avec Errbot
Tri de tas fait en langage C
Essayez Google Mock avec C
J'ai fait un blackjack avec du python!
Formater la source du langage C avec pycparser
J'ai créé COVID19_simulator avec JupyterLab
J'ai créé Word2Vec avec Pytorch
J'ai fait un blackjack avec Python.
Othello fait avec python (comme GUI)
J'ai créé wordcloud avec Python.
J'ai créé un site d'apprentissage C ++
Résoudre ABC163 A ~ C avec Python
Bases de SNS Python faites avec Flask
Créer Awaitable avec l'API Python / C
Ecriture du langage C avec Sympy (métaprogrammation)
Numer0n avec des objets fabriqués avec Python
J'ai fait une loterie avec Python.
Application de publication sur Twitter réalisée avec Django
Résoudre ABC168 A ~ C avec Python
Développement de jeux Othello avec Python
Résolu AtCoder ABC 114 C-755 avec Python3
Résoudre ABC162 A ~ C avec Python
Résoudre ABC167 A ~ C avec Python
Résoudre ABC158 A ~ C avec Python
Client de recherche Twitter fait avec bouteille
Segfo avec 16 caractères en langage C
J'ai créé un démon avec Python
Accélérer la compilation C / C ++ avec ccache
Votre propre client Twitter réalisé avec Django
Lecteur RSS simple réalisé avec Django
Client API Slack simple réalisé avec Python
Type de téléchargement de partage HTTP réalisé avec Python
J'ai fait un compteur de caractères avec Python
Assembleur X86 sous Linux (lien avec C)
Liaison multilingue C / C ++ facile avec CMake + SWIG
[C] [python] Lire avec AquesTalk sous Linux
Capteur humain amélioré fabriqué avec Raspberry Pi
J'ai fait une carte hexadécimale avec Python
J'ai fait un jeu de vie avec Numpy
J'ai fait un générateur Hanko avec GAN
Utilisation des fonctions C ++ de python avec pybind11
API de reconnaissance faciale sans serveur conçue avec Python
J'ai fait un jeu rogue-like avec Python
J'ai fait un simple blackjack avec Python
RaspberryPi L Chika avec Python et C #
[C, C ++, Python, JavaScript] L Chika avec Edison
J'ai créé un fichier de configuration avec Python
J'ai fait une application WEB avec Django
J'ai fait un simulateur de neurones avec Python
Communiquez avec les périphériques I2C sous Linux C
Application Othello (application iOS) réalisée avec Python (Kivy)