0
我对C完全陌生,我很少使用它。这次我需要一个大学项目。我必须编写一个小的c应用程序来测试我们在Linux内核(在调度程序上)所做的一些修改。seteuid()不起作用。原因?
在脚本内部,我想切换到另一个用户,以查看不同用户中CPU时间的分布情况。所以我用root权限启动我的小C程序(即使用sudo ./myapp)。编程内部 - 在我执行了一些需要root权限的操作之后 - 我想通过调用seteuid(1000)或setuid(1000)来切换回另一个uid,其中1000是现有用户的标识(我用来登录上)。然而这个调用似乎没有任何效果,它也不会抛出任何异常。 这里是我写的一个样本,只是为了测试UID开关:
#define _POSIX_SOURCE
#include <pwd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sched.h>
#include <unistd.h>
#include <string>
#include <time.h>
using namespace std;
int main(int argc, char *argv[])
{
int uid;
struct passwd *p;
if ((p = getpwuid(uid = getuid())) == NULL){
perror("getpwuid() error");
exit(1);
}
printf("***************************************\n");
printf("Executing user: %s (%d)\n", p->pw_name, p->pw_uid);
printf("***************************************\n");
seteuid(1000);
if ((p = getpwuid(uid = getuid())) == NULL){
perror("getpwuid() error");
exit(1);
}
printf("***************************************\n");
printf("Executing user: %s (%d)\n", p->pw_name, p->pw_uid);
printf("***************************************\n");
return 0;
}
有谁知道为什么它不会工作?任何帮助,高度赞赏! THX
//编辑: 由CHSH
+1 - 是的,你需要重新执行`p = getpwuid()`调用。 – 2009-07-31 12:53:35