Detaillierte Erläuterung der Exec-Funktionsfamilie

Einführung in Exec

Hilfe über den Befehl anzeigen:man 3 exec

Fügen Sie hier eine Bildbeschreibung ein

Die Funktion der Exec-Funktionsfamilie besteht darin, die ausführbare Datei anhand des angegebenen Dateinamens zu finden und sie zum Ersetzen des Inhalts des aufrufenden Prozesses zu verwenden. Mit anderen Worten: Sie führt eine ausführbare Datei innerhalb des aufrufenden Prozesses aus .

Funktionen in der exec-Funktionsfamilie kehren nach erfolgreicher Ausführung nicht zurück, da die Entitäten des aufrufenden Prozesses, einschließlich Codesegmente, Datensegmente und Stapel, durch neuen Inhalt ersetzt wurden und nur einige oberflächliche Informationen wie Prozess-IDs übrig bleiben. Nur wenn der Aufruf fehlschlägt, geben sie -1 zurück und setzen die Ausführung am Aufrufpunkt des ursprünglichen Programms fort.

Fügen Sie hier eine Bildbeschreibung ein
Bildreferenz von: [Linux] Prozesssteuerung verstehen und nutzen (exec-Funktionsfamilie)

Beim Ersetzen von Prozessprogrammen wird kein neuer Prozess erstellt, sondern nur der Code und die Daten des Programms geladen, um den ursprünglichen Prozess zu ersetzen.

Geschäftsführerfamilie

int execl(const char *path, const char *arg, .../* (char *) NULL */);
int execlp(const char *file, const char *arg, ... /* (char *) NULL */);
int execle(const char *path, const char *arg, .../*, (char *) NULL, char * const envp[] */);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);
int execve(const char *filename, char *const argv[], char *const envp[]);

Rückgabewert

  • Funktionen in der exec-Funktionsfamilie kehren nach erfolgreicher Ausführung nicht zurück.
  • Der Aufruf schlug fehl und -1 wurde zurückgegeben.

Gefolgt von verschiedenen Parametern, die unterschiedliche Bedeutungen darstellen

  • l(list): Parameteradressliste, abgeschlossen durch einen Nullzeiger

  • v(Vektor): Die Adresse des Zeiger-Arrays, das die Adresse jedes Parameters speichert

  • p(Pfad): Suchen Sie nach ausführbaren Dateien in dem durch die Umgebungsvariable PATH angegebenen Verzeichnis. Sie können env verwenden, um vorhandene Umgebungsvariablen anzuzeigen.

  • e (Umgebung): Die Adresse des Zeiger-Arrays, in dem die Zeichenfolgenadresse der Umgebungsvariablen gespeichert ist

Die ersten beiden werden häufiger verwendet

execl-Funktion

  • int execl(const char *path, const char arg, …/ (char *) NULL */);

    • Pfad: Der Pfad oder Name der auszuführenden Datei, der angegeben werden muss

    • arg: ist die Liste der Parameter, die zum Ausführen der ausführbaren Datei erforderlich sind. Der erste Parameter hat im Allgemeinen keine Auswirkung. Der Einfachheit halber schreibt er normalerweise den Namen des auszuführenden Programms. Beginnend mit dem zweiten Parameter handelt es sich um die Liste der für die Programmausführung erforderlichen Parameter. Die Parameter müssen mit NULL (Sentinel) enden.

Hinweis: Im Anfangsordner befinden sich zwei Dateien hello.c, deren Inhalt darin besteht, eine zufällige Anweisung auszugeben.hello

program

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

int main() {
    
    
    // 创建一个子进程,在子进程中执行exec函数族中的函数
    pid_t pid = fork();
    if(pid > 0) {
    
    
        // 父进程
        printf("i am parent process, pid : %d\n",getpid());
        sleep(1);
    }else if(pid == 0) {
    
    
        execl("hello","hello",NULL);
        perror("execl");
        printf("i am child process, pid : %d\n", getpid());
    }
    for(int i = 0; i < 3; i++) {
    
    
        printf("i = %d, pid = %d\n", i, getpid());
    }
    return 0;
}

Operationsergebnis

(base) user@ubuntu:~/Desktop/OS/NiuKe$ gcc -o test test.c -std=c99
(base) user@ubuntu:~/Desktop/OS/NiuKe$ ./test 
i am parent process, pid : 4426
Hello world
i = 0, pid = 4426
i = 1, pid = 4426
i = 2, pid = 4426

Wie Sie sehen, wird der Inhalt des untergeordneten Prozesses (Benutzerbereich) ersetzt und der Inhalt in der ausführbaren Hallo-Datei wird gedruckt.

execlp-Funktion

  • int execlp(const char *file, const char arg, … / (char *) NULL */);

    • Es sucht nach der angegebenen ausführbaren Datei in der Umgebungsvariablen. Wenn sie gefunden wird, wird sie ausgeführt. Wenn sie nicht gefunden wird, ist die Ausführung nicht erfolgreich.

    • Datei: Es muss nur der Name angegeben werden (der Pfad muss nicht angegeben werden)

program

#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
int main() {
    
    
    // 创建一个子进程,在子进程中执行exec函数族中的函数
    pid_t pid = fork();

    if(pid > 0) {
    
    
        // 父进程
        printf("i am parent process, pid : %d\n",getpid());
        sleep(1);
    }else if(pid == 0) {
    
    
        // 子进程
        execlp("ps", "ps", "aux", NULL);

        printf("i am child process, pid : %d\n", getpid());
    }
    for(int i = 0; i < 3; i++) {
    
    
        printf("i = %d, pid = %d\n", i, getpid());
    }
    return 0;
}

Ergebnisse ausgeben

(base) user@ubuntu:~/Desktop/OS/NiuKe$ gcc -o test test.c -std=c99
(base) user@ubuntu:~/Desktop/OS/NiuKe$ ./test 
i am parent process, pid : 4437
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.2 160048  9248 ?        Ss   Jan15   0:03 /sbin/init auto noprompt
root          2  0.0  0.0      0     0 ?        S    Jan15   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        I<   Jan15   0:00 [rcu_gp]
root          4  0.0  0.0      0     0 ?        I<   Jan15   0:00 [rcu_par_gp]
root          6  0.0  0.0      0     0 ?        I<   Jan15   0:00 [kworker/0:0H-kb]
...
user       4438  0.0  0.0  41424  3568 pts/3    R+   00:51   0:00 ps aux
i = 0, pid = 4437
i = 1, pid = 4437
i = 2, pid = 4437

execv-Funktion

  • int execv(const char *path, char *const argv[]);

    • argv: Alle laufenden Parameter in das Array schreiben

program

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

int main() {
    
    
    // 创建一个子进程,在子进程中执行exec函数族中的函数
    pid_t pid = fork();

    if(pid > 0) {
    
    
        // 父进程
        printf("i am parent process, pid : %d\n",getpid());
        sleep(1);
    }else if(pid == 0) {
    
    
        // 子进程
        char* argv[] = {
    
    "hello", NULL};
        execv("hello", argv);
        perror("execv");
        printf("i am child process, pid : %d\n", getpid());

    }

    for(int i = 0; i < 3; i++) {
    
    
        printf("i = %d, pid = %d\n", i, getpid());
    }
    return 0;
}

Ergebnisse ausgeben

(base) user@ubuntu:~/Desktop/OS/NiuKe$ gcc -o test test.c -std=c99
(base) user@ubuntu:~/Desktop/OS/NiuKe$ ./test 
i am parent process, pid : 4453
Hello world
i = 0, pid = 4453
i = 1, pid = 4453
i = 2, pid = 4453

Die übrigen Funktionen sind in der Verwendung ähnlich und werden nicht angezeigt~

Acho que você gosta

Origin blog.csdn.net/weixin_42888638/article/details/128705783
Recomendado
Clasificación