我在由root启动的C应用程序上使用execl。 execl的目标是以应用程序事先知道的用户的身份打开另一个应用程序。
以下是代码:
pid = fork();
if (pid == 0) {
sprintf(Cmd, "user1 -c '/usr/bin/iceweasel %s'", url);
execl("/bin/su", "/bin/su", Cmd, NULL);
//command is /bin/su user1 -c '/usr/bin/iceweasel <url>'
exit(0);
}
应用程序似乎挂起执行execl。它可能期望一个密码,但在shell上运行它不会遇到任何问题。根据我的需要,我需要能够获得iceweasel的进程ID才能控制它。
答案 0 :(得分:2)
使用setuid()
或seteuid()
函数可以更改当前进程的有效和/或实际uid。在您的情况下,您应该在fork()
和exec()
之间进行更改。
群组ID管理也是如此:setgid()
和setegid()
。