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