プログラム置換の原則

記事ディレクトリ

1. プログラムの置き換え

プログラム置換は、現在のプロセスのユーザー空間にあるすべてのコードとデータを新しいプログラムのコードとデータに置き換えるために使用されます。プログラム置換では、新しいプロセスは作成されませんが、現在のプロセスを使用して新しいプログラムのコードが実行されます。プログラム。fork によって子プロセスが作成されると、子プロセスはデフォルトで親プロセスのコードを実行し、子プロセスはプログラム置換を通じて新しいプログラムを実行できます。

exec 一連の関数、ヘッダー ファイル unistd.h

int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., 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[]);

戻り値:呼び出しが成功した場合は、新しいプログラムが直接実行されます。戻り値がない場合、エラーが発生した場合は -1 が返されます。exec系の関数は、エラーが発生した場合のみ戻ります。

パラメータ:

  • path: 置き換える実行可能プログラムへのパス
  • file: 置き換えられた実行可能プログラムのファイル名。オペレーティング システムは環境変数 PATH で実行可能プログラムを自動的に検索します。
  • arg および varargs... : 置換する実行可能プログラムのコマンドライン引数。varargs の最後の引数は NULL である必要があります。
  • argv 配列: コマンド ライン パラメーターの配列。最後の要素は NULL である必要があります。
  • envp 配列: 環境変数の配列。最後の要素は NULL である必要があります。
//process.c -> myprocess
#include <stdio.h>

int main()
{
    
    
    printf("hello, I am myprocess\n");

    return 0;
}

execシリーズの機能は以下の方法を参考に覚えることができます。

  • l は、コマンド ライン パラメータがリスト list の形式で渡されることを示します。
  • v は、コマンド ライン パラメーターがベクトル配列として渡されることを示します
  • p は、オペレーティング システムが環境変数 PATH を自動的に検索することを示します。
  • e は、ユーザーが環境変数を自分で管理することを示します
// test.c -> mytest
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    
    
    printf("hello, I am mytest\n");

    // 程序替换
    char* const myargv[] = {
    
    "myprocess", NULL};
    execv("/home/starrycat/code/Linux/learn/learn_6_16/myprocess", myargv);
    // execl("/home/starrycat/code/Linux/learn/learn_6_16/myprocess", "myprocess", NULL);

    // 出错才会返回
    exit(1); 
}

ここに画像の説明を挿入

// test.c -> mytest
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    
    
    printf("hello, I am mytest\n");

    // 程序替换
    // char* const myargv[] = {"myprocess", NULL};
    // execvp("myprocess", myargv);
    execlp("myprocess", "myprocess", NULL);

    // 出错才会返回
    exit(1); 
}

ここに画像の説明を挿入

//process.c -> myprocess
#include <stdio.h>

int main()
{
    
    
    printf("hello, I am myprocess\n");

    extern char** environ;
    for (int i = 0; environ[i]; ++i)
      printf("%d : %s\n", i, environ[i]);

    return 0;
}

// test.c -> mytest
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    
    
	// 程序替换
	char* const myargv[] = {
    
    "myprocess", NULL};
    char* const myenvp[] = {
    
    "MYENV=you can see me!", NULL};
    // execle("/home/starrycat/code/Linux/learn/learn_6_16/myprocess", "myprocess", NULL, myenvp);
	execve("/home/starrycat/code/Linux/learn/learn_6_16/myprocess", myargv, myenvp); // 系统调用

    // 出错才会返回
    exit(1); 
}

ここに画像の説明を挿入

exec シリーズのライブラリ関数の最下層は、システム コール execve を呼び出すことです。

int execve(const char *filename, char *const argv[], char *const envp[]);

おすすめ

転載: blog.csdn.net/qq_70793373/article/details/131236191