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.
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.
'# 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.
http://chikuwait.hatenablog.com/entry/2017/10/05/001126
Recommended Posts