現在のシェルをexecl()で置き換えます。

現在のシェルをexecl()で置き換えます。

次のCプログラムでは:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int     main(void){
        char *shell = getenv("SHELL");
        execl(shell, NULL, NULL);
        perror("execl() failed");
}

上記のコードを実行すると、新しいシェルが表示されます。新しいシェルに入ると、exit以前のシェルに戻ります。

execl()現在のシェルを新しいシェルに置き換えてはいけませんか(そして古いシェルの中に新しいシェルが作成されていません)?

(Linux 4.16)

ベストアンサー1

execl()現在のシェルを新しいシェルに置き換えてはいけませんか(そして古いシェルの中に新しいシェルが作成されていません)?

これは、シェルではなくプログラムを実行するプロセスである現在のプロセスを置き換えます。

プログラムを起動すると、プロセスツリーは次のようになります。

old shell → your program

プログラムが を呼び出すと、そのexecl()ツリーは次のようになります。

old shell → new shell

したがって、シェルを終了すると、前のシェルに戻ります。

既存のシェルを交換するには、既存のシェルに新しいプログラムと交換するように指示する必要があります。

exec ./yourprogram

その後、プログラムは新しいシェルに置き換えられ、ユーザーは古いシェルを新しいシェルに置き換えます(プログラムに関連する追加の手順)。

おすすめ記事