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