そのため、プログラムをフォークして、同じプログラムを再度実行します。
このプログラムは、開始時に getenv("PATH"); を介して $PATH 環境変数を解析します。しかし、何らかの理由で、子プロセスの env $PATH が空です。
char *path = getenv("PATH");
if(fork() == 0)
{
execve(path, argv, NULL);
}
else //parent
{
wait(0);
}
それはあなたが使用する方法ではありませんexecve()
。最初の引数は実行可能ファイルへのパスであり、PATH環境変数ではありません。3番目の引数は、子プロセスの環境を指定する場所です。ここでNULLを渡すと、子は環境変数(PATHを含む)を継承しません。
「理由」は、の最後のパラメーターにNULLを渡すことですexecve
。これは、新しいプロセスの環境を表すname=value文字列のNULLで終了する配列である必要があります。NULLを渡すことは、子が空の環境を取得することを意味します。
また、拡張されたPATH変数を実行しようとしていますが、これは最初はほとんど意味がありません。