私はsetreuidと少し混乱しています。
シナリオ: プロセスは通常のユーザー (id: cateof) として実行されますが、ごく短時間、root として実行する必要があります。アクセス許可を cateof から root に昇格させてから、通常のユーザーに戻す必要があります。私が最初に考えたのは、「ルート呼び出し」を setreuid(0, 0); の間にネストすることでした。および setreuid(ruid, euid); 十分でしょうが、私は間違っていました。通常のユーザーに戻る唯一の方法は、「root 呼び出し」の後に setreuid(ruid, euid) を生で 2 回呼び出すことです。
コードは次のとおりです。
int main(...) {
//check the permission, that the program is setuid
//become normal user
ruid = getuid ();
euid = geteuid ();
setreuid(ruid, euid);
...
setreuid(0, 0);
root_action();
setreuid(ruid, euid); //undo root #1
setreuid(geteuid(), getuid()); //undo root#2
最後の行でsetreuid(geteuid(), getuid())を呼び出さないと、プロセスはルートとして実行され続けます。なぜ私はそれを2回呼び出す必要があるのですか???